finding common elements in a matrix

20 visualizaciones (últimos 30 días)
mahesh bvm
mahesh bvm el 8 de En. de 2014
Editada: Stephen23 el 25 de Feb. de 2016
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 comentarios
Matt J
Matt J el 8 de En. de 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
mahesh bvm el 8 de En. de 2014
Yes we need to consider the floating point numbers in each row too....

Iniciar sesión para comentar.

Respuesta aceptada

Jos (10584)
Jos (10584) el 8 de En. de 2014
I have to make a few assumptions as your question and comments are not clear.
Case A - assumptions: (1) exactly one common element per row (2) in the same column in A and B
tf = abs(A-B) < tol
C = A(tf)
Case B - assumptions: (1) exactly one common element per row (2) that element may be at different columns between A and B
tf = abs(A-B) < tol || abs(fliplr(A)-B) < tol
C = A(tf)
Case C - assumptions: (1) zero or one common element per row (2) in the same column in A and B
tf = abs(A-B) < tol
[r,c] = find(tf)
C = zeros(size(A,1),1)
C(r) = A(tf)
Case D - Assumptions: (1) zero or one common element per row (2) that element may be at different columns between A and B
...
  5 comentarios
Salar
Salar el 25 de Feb. de 2016
Editada: Salar el 25 de Feb. de 2016
And also to be honest, I think this code doesn't do the work see :
a =
90 50
20 11
0 87
11 110
>> b= [ 41 90; 11 31;87 0; 11 -2]
b =
41 90
11 31
87 1
11 -2
>> tf = abs(a-b) < 1e-1 | abs(fliplr(a)-b) < 1e-1; >> LambdaS = a(tf)
LambdaS =
20
0
11
50
87
The output that I need to get is
LambdaS : 90 11 87 11
Stephen23
Stephen23 el 25 de Feb. de 2016
Editada: Stephen23 el 25 de Feb. de 2016
You need to take into account that MATLAB operates column-wise:
>> a = [90,50;20,11;0,87;11,110]
>> b = [41,90;11,31;87,1;11,-2]
>> at = a.';
>> bt = b.';
>> xt = at==bt | at==bt([2,1],:)
>> at(xt)
ans =
90
11
87
11

Iniciar sesión para comentar.

Más respuestas (2)

Patrik Ek
Patrik Ek el 8 de En. de 2014
Editada: Patrik Ek el 8 de En. de 2014
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 comentarios
Patrik Ek
Patrik Ek el 8 de En. de 2014
Editada: Patrik Ek el 8 de En. de 2014
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
Salar el 25 de Feb. de 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

Iniciar sesión para comentar.


David Sanchez
David Sanchez el 8 de En. de 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 comentarios
Matt J
Matt J el 8 de En. de 2014
If there is no common element in a row, you will get 0 in that row.
Patrik Ek
Patrik Ek el 8 de En. de 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.

Iniciar sesión para comentar.

Categorías

Más información sobre Matrix Indexing en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by