[英]Making a 3d array MATLAB
在MATLAB中
[Z,S]=meshgrid(0.01:0.01:1)
我还有一个名为X的100000x2矩阵,每一行都有两组数据-p是第一列,x是第二列。
我想计算j索引行的exp ^(-S * X(j,2))。(* Z. ^ X(j,1))。 结果应为100x100x100000矩阵。 然后将沿第3维求平均值,并生成网格图。 我尝试过使用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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.