finding common elements in a matrix
Show older comments
I believe there should be a simple answer but I could not get it myself.
Assume there is a matrix say A =
1.3693 1.6266
0.2054 1.3820
1.4125 0.4844
0.0734 0.7480
1.0499 1.0451
There is one more matrix
B =
1.3693 2.0920
1.9255 1.3820
1.4125 1.8541
0.0734 1.4454
1.0499 1.4112
Now, How do I find common elements in every row of these two matrices?? I must get a final coloumn vector of only the 'common element' of every row of these two matrices.
Any quick reply is highly appreciated
3 Comments
Matt J
on 8 Jan 2014
You cannot organize the result into a vector unless you are sure that there is going to be exactly 1 common element in each row, which is not the case in your example.
Matt J
on 8 Jan 2014
Also, will the "common element" be exactly equal in both A and B or do you need to worry about floating point errors?
mahesh bvm
on 8 Jan 2014
Accepted Answer
More Answers (2)
You may use the function ismember. The syntax is
[member,ind] = ismember(A,B);
The first output shows which elements in A that belongs to B and the second output shows at which linear index in B it appears. Then it would be easy to determine at which row it appears since the element numbering in a matrix in matlab is columnwise. The row should just be
rows = mod(ind,nrows);
rows(rows==0 && ind>0) = nrows;
This may however not result in a column vector unless there are exactly 1 common index per row.
BR Patrik
3 Comments
That would work I guess, but it is also possible to do a round of on A and B eg,
A = round(10*A)/10; (one decimal)
and analouge on B. Where 10 is here 1/tol. This will work for any tolerance.
A = round(1/tol*A)*tol;
However, this is more like a truncation. It truncates the values in A to a value that is a multiple of 1/tol.
Salar
on 25 Feb 2016
Hello,
What are we supped to put for "nrows" ? when I use your code as it is it says undefined function "nrows" and when I plug in my number of rows for it the matrix rows that I get is just not correct. thanks
David Sanchez
on 8 Jan 2014
A = [ 1.3693 1.6266;
0.2054 1.3820;
1.4125 0.4844;
0.0734 0.7480;
1.0499 1.0451];
B = [1.3693 2.0920;
1.9255 1.3820;
1.4125 1.8541;
0.0734 1.4454;
1.0499 1.4112];
C=(A==B);
D=A.*C;
E=sum(D,2);
E =
1.3693
1.3820
1.4125
0.0734
1.0499
% single line code
E2 = sum(A.*(A==B),2);
E2 =
1.3693
1.3820
1.4125
0.0734
1.0499
3 Comments
mahesh bvm
on 8 Jan 2014
Edited: Matt J
on 8 Jan 2014
Matt J
on 8 Jan 2014
If there is no common element in a row, you will get 0 in that row.
Patrik Ek
on 8 Jan 2014
This code snippet does only consider elements that has the exact location. It will not react on for example,
A = [1 2;
3 4];
B = [2 1;
4 3];
Which will yield a vector,
E = [0;
0];
Also this is also requires that each row has exactly one common value.
Categories
Find more on Resizing and Reshaping Matrices 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!