Using ismember to seek out pairs

1 view (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);

Tags

Community Treasure Hunt

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

Start Hunting!