How to change an if-condition in a loop by logical indexing to make my code faster?
7 views (last 30 days)
Show older comments
Hi,
I have got a serious performance problem with the Matlab-code below. It works but the "for"-loop - especially the "if"-condition - is really slow.
How can I rewrite the "if"-condition to make my code faster? Maybe the key is to form a logical index?
Thanks a lot!
My code: - "A.", "B.": structural arrays containing matrices - "C.": structural array containing vectors
for k=1:numel(fields_A)
A = A.(fields_A{k});
B = B.(fields_A{k});
C = C.(fields_A{k});
for i = 1:size(A,1)
for j = 1:size(A,1)
if (A(i,:) == B(j,:) & C(i,1) ~= 1), C(j,1)=1;
end
end
end
A(find(C(:,1)==1),:)=[];
A.(fields_A{k})= A;
end
0 Comments
Accepted Answer
Daniel Shub
on 11 Apr 2012
It is likely that
A(i,:) == B(j,:)
is not doing what you think it is, especially in the context of an if statement. You may want
isequal(A(i,:), B(j, :));
or
all(A(i,:) == B(j,:))
or maybe
any(A(i,:) == B(j,:))
Also, there is no reason to evaluate
C(i,1) ~= 1
inside the j loop. Depending on your data, this could save a significant portion of time or very little. You probably also want to use
&&
instead of
&
since the former shot circuits when possible saving a comparison.
0 Comments
More Answers (1)
Andrei Bobrov
on 11 Apr 2012
[EDIT]
try
fn = fieldnames(A);
for jj = 1:numel(fn)
n = fn{jj};
[a b] = ismember(A.(n),B.(n),'rows');
C.(n)(b(b ~= 0),1) = 1;
A.(n) = A.(n)(C.(n)(:,1)~=1,:);
end
0 Comments
See Also
Categories
Find more on Loops and Conditional Statements in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!