矢量化嵌套循环,其中一个循环变量依赖于另一个循环变量

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...到目前为止我尝试过什么:jk术语的组合(即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)

  • 这个解决方案让我想起[Ramanujan](https://en.wikipedia.org/wiki/Srinivasa_Ramanujan).我完全不知道你到底怎么想出那个答案. (7认同)