MATLAB Answers

ismember has different length depending on argument order

4 views (last 30 days)
I have 3 arrays with two columns each. Array 2 contains indices of matches between column1 of array 1 and 3.
Now I only want to keep rows in arrays 1 and 3, which are represented in array 2.
I'm using this code right now:
mask1 = ismember(array2(:,1), array1);
mask2 = ismember(array2(:,2), array3);
mask1 = logical(mask1.*mask2)
array2 = array2(mask1,:);
mask3 = ismember(array1, (array2(:,1)));
array1 = array1(mask3,:);
mask4 = ismember(array3, (array2(:,2)));
array3 = array3(mask4,:);
The problem is, that
ismember(array1, (array2(:,1)))
has a different length than
ismember((array2(:,1)), array1)
even I just switched the arguments position.
Is there anyone who can explain to me why this can happen and how to fix it?

Accepted Answer

Felix Bertoli
Felix Bertoli on 1 Aug 2021
Thanks! I figured it out. It was, because some numbers were duplicate, so the results were confusing for me.
  1 Comment
Image Analyst
Image Analyst on 1 Aug 2021
Again, you can simplify it and just use logical indexing rather than the confusing ismember(). It will be simpler and more intuitive.

Sign in to comment.

More Answers (3)

Yongjian Feng
Yongjian Feng on 1 Aug 2021
Type
help ismember
in the matlab command line window to get quick help.
Basically the answer is the same length as the first input argument. When you have
ismember([a, b], otherArrary)
The answer is an array of length of 2 for this example. Each element in the returned array shows whether the corresponding elelment in the first import array is a member of the second input array.

Image Analyst
Image Analyst on 1 Aug 2021
You don't even need the admittedly confusing ismember() function. Assuming the matrices are regular numerical arrays (not cell arrays of strings), you can use simple logical indexing:
% Create sample data matrices m1 and m3:
m1 = [(1:9)', (11:19)']
m3 = [[0,2,0,4,0,6,0,8,0]', (11:19)']
% Find where column 1 of m1 matches column 1 of m3 and store in m2:
m2 = m1(:, 1) == m3(:, 1)
% Keep only rows in m1 and m2 that are in m3
rowsToKeep = m2;
m1 = m1(rowsToKeep, :)
m3 = m3(rowsToKeep, :)
You'll see:
m1 =
1 11
2 12
3 13
4 14
5 15
6 16
7 17
8 18
9 19
m3 =
0 11
2 12
0 13
4 14
0 15
6 16
0 17
8 18
0 19
m2 =
9×1 logical array
0
1
0
1
0
1
0
1
0
m1 =
2 12
4 14
6 16
8 18
m3 =
2 12
4 14
6 16
8 18

Matt J
Matt J on 1 Aug 2021
Wouldn't it just be,
mask = ismember(array2(:,1), array1) & ismember(array2(:,2), array3);
fn=@(z) z(mask,:);
array1=fn(array1);
array2=fn(array2);
array3=fn(array3);

Products


Release

R2021a

Community Treasure Hunt

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

Start Hunting!

Translated by