matlab - 绘制随机数的非满矩阵

标签 matlab performance vectorization

我正在进行蒙特卡洛模拟,其中每次重复都需要随机变量的总和或乘积。我的问题是如何有效地执行此操作,因为整个模拟应尽可能矢量化。

例如,假设我们要取 5103 随机数的总和,用向量 表示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/

相关文章:

css - css 中的嵌入式字体会影响每次使用的性能吗?

python - 如何根据条件有效地将函数应用于数组中的值?

matlab - 编写一个递归函数,计算 n >= 0 除以 d > 0 时的余数 r

java - 如何从 MATLAB 代码捕获 java 异常

MongoDB,即使查询字段形成分区,也会减慢查询速度吗?

c++ - STL 替代方案

python - For 循环 vs Numpy 向量化计算时间

c++ - AVX2是最有效的基于 mask 包装的方法吗?

matlab - 如何绘制频谱图函数的结果?

arrays - 在 MATLAB 中查找向量中重复次数最多的 10 个元素