Rapid Vector Matching/Search Problem
2 views (last 30 days)
Show older comments
Kyle Johnston
on 20 Aug 2014
Commented: Oleg Komarov
on 23 Aug 2014
I have a matrix (we'll call A) of size m x n, and a vector (we'll call B) that is a 1 x n, and I am interested in finding the one unique index (and I know there is just one) where A(index,:) equals B, is there a way for me to quickly make the determination in MATLAB besides using the following code:
for i = 1 : m
if ((isequal(A(i,:), B)))
indexIntrest = i;
break;
end
end
Thanks
Accepted Answer
Joseph Cheng
on 20 Aug 2014
Edited: Joseph Cheng
on 20 Aug 2014
you'll need to use the function ismember()
such as:
found_row = ismember(A,B,'rows')
which will return a logical array where a 1 will represent a match. then by doing something like this
A= randi(2,100,4);
indexIntrest=find(ismember(A,[ 2 1 1 1],'rows'))
will return the indexes that match.
3 Comments
Joseph Cheng
on 21 Aug 2014
I did it that way just in case you had more than 1. When i do your ismember(A,B,'rows') it does not come back with the index of which row.. that is why i used find to come up with the index.
Joseph Cheng
on 21 Aug 2014
Alright finally grasped how the perms() function lays out the permutations. Needed to eat a cookie and it came to me.
clc
clear all
n=10;
A= perms(1:n);
B=A(randi(length(A),1),:);
space = factorial(n-1);
tic
for i = (space*(n- B(1)) + 1) : space*(n- B(1) + 1)
if (isequal(A(i,:),B))
index3 = i
break;
end
end
looptime = toc;
index4 = 1;
tic
seq = [n:-1:1];
for i =1:n-1
space=factorial(n-i);
Subind = find(seq==B(i)); %determine which section
index4= index4+space*(Subind-1);
seq = A(index4,i+1:end); %contains order of next column
end
calctime = toc;
disp([A(index4,:);B])
disp(['loop time: ' num2str(looptime)])
disp(['calc time: ' num2str(calctime)])
disp(['loop - calc: ' num2str(looptime-calctime)])
More Answers (1)
Oleg Komarov
on 21 Aug 2014
find(all(bsxfun(@eq, A,B),2))
What happens is every row of A is tested with @eq for element-wise equality against B, producing a m x n logical matrix. Then, all() tests each row if all elements are true, and find() returns the position.
0 Comments
See Also
Categories
Find more on Matrix Indexing in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!