如何从 Octave/matlab 中的均值和 st.dev 向量生成多个随机分布?

问题描述

所以我有一个维度为 [5,1] 的值的向量 V。对于这个向量 V[i] 中的每个值,我想生成假设 5 个正态分布的数字,均值 V[i] 和固定的 st 偏差。所以最后我会有一个矩阵 [5,5],它在 i 行上有 5 个正态分布的值,均值 V[i]。如何在不使用 for 循环的情况下使用 Octave/matlab 执行此操作?实际上,我想将均值 V 的向量传递给 normrnd 函数,并为向量 V 中的每个均值获得一组 n 个正态分布数。

解决方法

在数组输入中使用 normrnd

您可以将均值向量转换为矩阵并将其传递给 normrnd。这是有效的,因为如 normrnd's documentation 中所述,

r = normrnd(mu,sigma) [...]

要从多个分布生成随机数,请使用数组指定 musigma。如果 musigma 都是数组,则数组大小必须相同。如果 musigma 是标量,则 normrnd 将标量参数扩展为与另一个参数相同大小的常量数组。 r 中的每个元素都是由 musigma 中的相应元素指定的分布生成的随机数。

示例:

mu = [30; 15; 7; -60; 0]; % vector of means
std = 2;                  % common standard deviation
N = 4;                    % number of samples for each mean
result = normrnd(repmat(mu(:),1,N),std);

使用带有隐式扩展的 randn

您可以使用标准高斯分布的样本生成矩阵,乘以所需的标准偏差,然后将所需的均值添加到每一行:

result = mu(:) + std*randn(numel(mu),N);

这是可行的,因为

  • 改变零均值高斯分布的标准偏差相当于缩放;
  • 改变高斯分布的均值等同于移位。

使用 implicit expansion 完成移位。这种方法避免了之前方法构建重复均值的中间矩阵,并调用randn而不是normrnd,因此可能更有效。