在MATLAB中我有
[Z,S]=meshgrid(0.01:0.01:1)
我还有一个100000x2的矩阵X,每一行有两组数据p是第一列X是第二列
我想计算exp^(-S*X(j,2)).(* z ^X(j,1))其中j索引行。结果应该是一个100x100x100000的矩阵。然后沿着第三维度进行平均,并生成网格图。我试过使用for循环
[Z,S]=meshgrid(0.01:0.01:1)
for j=1:100000
phi(j)=exp^(-S.*X(j,2)).*(Z.^X(j,1))
end
生成我需要的100x100x100000数组。然而,这给了我错误
In an assignment A(I) = B, the number of elements in B and I must be the same.
Error in phi (line 4)
phi(j)=exp(-S.*X(j,2)).*(Z.^X(j,1));
我不确定为什么会发生这种情况?谁能想出一个更好的方法来找到我想要的结果?因为我猜可能会有一个完全矢量化的解决方案(或者至少使用for循环)?
假设您使用另外两个嵌套循环来获取Z
和S
,因此代码将总共有三个嵌套循环。
现在,在可向量化嵌套循环的情况下,向量化技术并没有改变,比如分别处理涉及不同迭代器的代码的不同部分。因此,这里有三个迭代器,其中两个长度为100
,第三个迭代器一直到100000
。把矢量化的想法放在一个简洁的注释文本中,用基于bsxfun
的代码解决你的问题-
%// Get vectorized equivalent of exp(-S.*X(j,2)) and keeping in mind that
%// since the last (3rd) dimension of final output has length same as the
%// number of elements in X(:,2), so "throw" this to 3rd dim with permute.
%// Then, use bsxfun to let the broadcasting being taken care off by MATLAB.
p1 = exp(-bsxfun(@times,V.',permute(X(:,2),[3 2 1]))); %//'
%// Going with same philosophy as before, get vectorized (Z.^X(j,1))
p2 = bsxfun(@power,V,permute(X(:,1),[3 2 1]));
%// Finally "merge" earlier two parts for final output
phi_out = bsxfun(@times,p1,p2);