我可以优化这个 Matlab for 循环吗?

Can I optimise this Matlab for loop?

我有以下代码:

np = 25;
j = 1:3;
count = 2;

for i = 2:total_NN
   A(i) = B(j) * C(count, :)'; 
   count = count + 1;

   % When this condition is met we will add to j and reset count:
   if rem(i-np, np-1) == 0 
       j = j + 2; 
       count = 2; 
   end
end

我试图通过删除内部 if 语句并保留其功能来优化它。我试过这样做,但它没有用,也没有消除 if 语句:


for i = 2:total_NN
   A(i) = B(j) * C(count, :)'; 
   count = count + 1;

   z = rem(i-np, np-1) != 0;
   j = j + 2*z;

   if rem(i-np, np-1) == 0  
       count = 2; 
   end
end

我能做什么? if 语句极大地减慢了我的代码速度。

您可以在每个索引的循环之前计算 if 条件

np = 25;
j = 1:3;
count = 2;
iArr = 2:total_NN;
r = (rem(iArr-np,np-1) == 0);

for ii = iArr 
   i = iArr(ii);

   A(i) = B(j) * C(count, :)'; 
   count = count + 1;

   % When this condition is met we will add to j and reset count:
   if r(ii)
       j = j + 2; 
       count = 2; 
   end
end

没有完整的示例来测试或没有内存限制的感觉,很难验证任何进一步的优化,但您可能会定义

jArr = (1:3) + 2*cumsum(r(:)); % all j values from the loop, select j=jArr(ii,:) for each loop

循环之前的 count 也有类似的东西。在这一点上,您甚至可以向量化整个矩阵运算,但这超出了这个问题的范围。