Using ismember to seek out pairs

4 views (last 30 days)
Currently messing with some code which I can't quite get to do what I want.
I have A = [1 2 5; 4 5 7; 7 8 9; 4 7 10; 6 7 2] and B = [2 3; 4 9; 7 9; 7 6]
I want b to be compared with a and using ismember and indicate all the rows that both values in each row in b exist.
So here the answer would be
ans = [0; 0; 1; 0; 1]
The 3rd and 5th rows in A contain a whole row in B so a 1 is returned.
At the moment I am trying, ismember(A,B) but this returns
ans =
0 1 0
1 0 1
1 0 1
1 1 0
1 1 1
as ismember simply return a 1 when any value of B is found in A. Any idea how to use ismember (or otherwise) to do what I am needing?
Thanks

Accepted Answer

Azzi Abdelmalek
Azzi Abdelmalek on 18 Sep 2013
Edited: Azzi Abdelmalek on 18 Sep 2013
A = [1 2 5; 4 5 7; 7 8 9; 4 7 10; 6 7 2]
B = [2 3; 4 9; 7 9; 7 6]
for k=1:size(A,1)
out(k)=any(all(ismember(B,A(k,:)),2));
end
out
%or
out=arrayfun(@(x) any(all(ismember(B,A(x,:)),2)),1:size(A,1))
  5 Comments
Azzi Abdelmalek
Azzi Abdelmalek on 18 Sep 2013
Do you mean
y={[1 2 5; 4 5 7; 4 7 10; 6 7 2;44 1 7],[1 2 5; 4 5 7; 7 8 9; 4 7 10; 6 7 2]}
B = [2 3; 4 9; 7 9; 7 6;44 7;11 12;1 2]
for k=1:numel(y)
A=y{k}
out{k}=arrayfun(@(x) any(all(ismember(B,A(x,:)),2)),1:size(A,1));
end
celldisp(out)
Craig
Craig on 18 Sep 2013
Perfect thanks alot!

Sign in to comment.

More Answers (1)

Andrei Bobrov
Andrei Bobrov on 18 Sep 2013
Edited: Andrei Bobrov on 18 Sep 2013
w = bsxfun(@eq,reshape(A',[],1),reshape(B',1,[]));
out = any(blockproc(w,[3 2],@(x)sum(x.data(:)))==2,2);
or
w = bsxfun(@eq,reshape(A',[],1),reshape(B',1,[]));
z = conv2(w + 0,ones(3,2));
out = any(z(3:3:end,2:2:end)==2,2);

Categories

Find more on Characters and Strings in Help Center and File Exchange

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!