问题描述
所以我有一个维度为 [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)
[...]
要从多个分布生成随机数,请使用数组指定 mu
和 sigma
。如果 mu
和 sigma
都是数组,则数组大小必须相同。如果 mu
或 sigma
是标量,则 normrnd
将标量参数扩展为与另一个参数相同大小的常量数组。 r
中的每个元素都是由 mu
和 sigma
中的相应元素指定的分布生成的随机数。
示例:
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
,因此可能更有效。