我正在进行蒙特卡洛模拟,其中每次重复都需要随机变量的总和或乘积。我的问题是如何有效地执行此操作,因为整个模拟应尽可能矢量化。
例如,假设我们要取 5
、10
和 3
随机数的总和,用向量 表示len = [5;10;3]
。然后我目前正在做的是绘制一个完整的随机数矩阵:
A = randn(length(len),max(len));
创建不需要的数字的掩码:
lenlen = repmat(len,1,max(len));
idx = repmat(1:max(len),length(len),1);
mask = idx>lenlen;
然后我可以“填充”矩阵,因为我对总和感兴趣,填充必须为零(对于乘积的情况,填充必须为 1)
A(mask)=0;
获得:
A =
1.7708 -1.4609 -1.5637 -0.0340 0.9796 0 0 0 0 0
1.8034 -1.5467 0.3938 0.8777 0.6813 1.0594 -0.3469 1.7472 -0.4697 -0.3635
1.5937 -0.1170 1.5629 0 0 0 0 0 0 0
然后我可以把它们加在一起
B = sum(A,2);
但是,我发现我不得不抽取太多随机数然后将它们丢弃,这相当多余。在实际情况下,我需要在数十万次重复范围内并且向量 len
可能变化很大,即很容易我必须绘制两倍或三倍的随机数比需要的多。
最佳答案
您可以生成所需数量的随机数,使用 repelem
创建分组变量,并使用 accumarray
计算每组的总和:
len = [5; 10; 3];
B = accumarray(repelem(1:numel(len), len).', randn(sum(len),1));
关于matlab - 绘制随机数的非满矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49979585/