我可以优化这个 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
也有类似的东西。在这一点上,您甚至可以向量化整个矩阵运算,但这超出了这个问题的范围。
我有以下代码:
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
也有类似的东西。在这一点上,您甚至可以向量化整个矩阵运算,但这超出了这个问题的范围。