制作三维阵列的MATLAB



在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循环)?

假设您使用另外两个嵌套循环来获取ZS,因此代码将总共有三个嵌套循环。

现在,在可向量化嵌套循环的情况下,向量化技术并没有改变,比如分别处理涉及不同迭代器的代码的不同部分。因此,这里有三个迭代器,其中两个长度为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);

相关内容

  • 没有找到相关文章

最新更新