'Can I optimise this Matlab for loop?
I have the following code:
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
I am trying to optimise it by removing the inner if statement and retaining its functionality. I tried doing this but it did not work nor eliminated the if statement:
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
What can I do? The if statement is slowing down my code immensely.
Solution 1:[1]
You could calculate the if condition before the loop for every index
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
Without a complete example to test or sense of memory constraints it's hard to validate any further optimisations, but you could likely define
jArr = (1:3) + 2*cumsum(r(:)); % all j values from the loop, select j=jArr(ii,:) for each loop
And something similar for count before the loop. At which point you may even be able to vectorise the entire matrix operation but that's beyond the scope of this question.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 |
