2015-08-29 190 views
1

在MATLAB中我有制作3D阵列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循环)?

+0

我有以下的指数麻烦 - 你能说多一点有关你想创建的对象?这就像一个二维指数随机噪声或什么? – ConfusinglyCuriousTheThird

+1

您正试图将一个矩阵分配给'phi'中的一个点。因为这个,你显然会遇到尺寸不匹配的问题。 – rayryeng

+0

@ anon0909没有那部分不是二维指数 - 我试图计算e ^( - sp)z^x,其中p和x是存储在数组X中的随机变量。已采取100000个样本,以便X的每一行都有p和x对应一个样本。我的问题中的j只是数字,我们正在看哪个特定的样本。然后,我将要对所有样本进行平均。 – Ansh

回答

2

假设您使用两个更多的嵌套循环来获取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); 
+0

这对我很有帮助。不幸的是,实际功能产生了很大的值,因此使用这个功能后,我能够成功地消除在我的项目中生成我想要的图(phi_out)。然而,你的答案有一些非常有用的提示,所以我非常欣赏这个帮助。 – Ansh