考虑数组
A = [x1,x2,x3,...,xn]
Run Code Online (Sandbox Code Playgroud)
那么你可以通过简单的方法在Matlab中将两个连续的数字一起添加到数组中,这样就可以得到:
B = [x1+x2, x3+x4,...]
Run Code Online (Sandbox Code Playgroud)
请注意,每个元素仅出现在一个总和中.
我正在进行蒙特卡罗模拟,其中每次重复都需要随机数随机变量的总和或乘积.我的问题是如何有效地做到这一点,因为整个模拟应该尽可能地矢量化.
例如,假设我们要采取的总和5,10并且3随机数,由向量表示len = [5;10;3].那么我目前正在做的是绘制一个完整的随机数矩阵:
A = randn(length(len),max(len));
Run Code Online (Sandbox Code Playgroud)
创建不需要的数字的掩码:
lenlen = repmat(len,1,max(len));
idx = repmat(1:max(len),length(len),1);
mask = idx>lenlen;
Run Code Online (Sandbox Code Playgroud)
然后我可以"填充"矩阵,因为我感兴趣的是填充必须为零(对于产品的情况,填充必须为1)
A(mask)=0;
Run Code Online (Sandbox Code Playgroud)
获得:
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
Run Code Online (Sandbox Code Playgroud)
之后我可以将它们加在一起
B = sum(A,2);
Run Code Online (Sandbox Code Playgroud)
但是,我发现我必须绘制太多的随机数然后将它们扔掉,这是多余的.在实际情况中,我需要在数十万次重复的范围内,并且矢量len可能变化很大,即很容易就是我必须绘制两倍或三倍的随机数而不是所需数量.