我最近学习了如何在我之前询问的question中向量化“简单”嵌套循环。但是,现在我也在尝试向量化以下循环
A=rand(80,80,10,6,8,8);
I=rand(size(A1,3),1);
C=rand(size(A1,4),1);
B=rand(size(A1,5),1);
for i=1:numel(I)
for v=1:numel(C)
for j=1:numel(B)
for k=1:j
A(:,:,i,v,j,k)= A(:,:,i,v,j,k)*I(i)*C(v)*B(j)*((k-1>0)+1);
end
end
end
end
因此,现在
k
取决于j
……到目前为止,我已经尝试了什么:j
和k
术语的组合(即B(j)*((k-1>0)+1)
给出了一个三角形矩阵,我可以设法对它们进行独立矢量化处理: B2=tril([ones(8,1)*B']');
B2(2:end,2:end)=2*B2(2:end,2:end);
但这给了我正确的(j,k)矩阵,而不是一种使用它向量化剩余循环的方法。也许我也走错了路...那么如何向量化这种类型的循环?
最佳答案
在对上一个问题的公认解决方案one of your comments中,您提到了基于bsxfun(@times,..,permute..)
的连续代码更快。如果是这样,您也可以在此处使用类似的方法。这是与tril
一起使用这种模式的代码-
B1 = tril(bsxfun(@times,B,[1 ones(1,numel(B)-1).*2]));
v1 = bsxfun(@times,B1, permute(C,[3 2 1]));
v2 = bsxfun(@times,v1, permute(I,[4 3 2 1]));
A = bsxfun(@times,A, permute(v2,[5 6 4 3 1 2]));
关于matlab - 向量化嵌套循环,其中一个循环变量依赖于另一个,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26167321/