Max*_*Max 6 matlab for-loop vectorization multidimensional-array
我最近学会了如何在我之前提出的问题中对一个"简单"的嵌套循环进行矢量化.但是,现在我也试图对以下循环进行矢量化
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
Run Code Online (Sandbox Code Playgroud)
所以现在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);
Run Code Online (Sandbox Code Playgroud)
但是这给了我正确的(j,k)矩阵,而不是用它来对剩余循环进行矢量化的方法.也许我也走错了路......所以我怎样才能将这种类型的循环矢量化?
Div*_*kar 12
在您对上一个问题的公认解决方案的一个评论中,您提到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]));
Run Code Online (Sandbox Code Playgroud)