how to find common elements of two matrices considering also the repeated values?
    5 visualizzazioni (ultimi 30 giorni)
  
       Mostra commenti meno recenti
    
    Gessica Cos
 il 13 Giu 2018
  
    
    
    
    
    Commentato: Gessica Cos
 il 14 Giu 2018
            Hello everybody, i would like to know how to find the position of elements of a matrix who are in another matrix. For example, letting i have two matrix A and B:
A= [2 1 2 
    3 2 5
    4 7 5
    4 8 10]
B= [4 7 5
    2 8 10
    4 1 2
    3 2 5]
I would like the output to provide the position of the elements of the B matrix that are present in the A matrix considering also repeated values.
For example "it finds in which position the element B (1,1) is present in the matrix A (:, 1), in which position the element B (2,1) is present in the matrix A (:, 1), in which position the element B (3,1) is present in the matrix A (:, 1) and so on ". So similarly for the other columns "find in which position the element B (1,2) is present in the matrix A (:, 2) etc"
Regarding the repetition I would like to make sure that if, for example, there are 3 repetitions in a column, each repetition will have an increasing order index, ie:
A= [ 2
4
4
4]
B=[4
2
4
4]
output=[2
1
3
4 ]
I tried to use the MATLAB function "intersect", but it give as outputs only the indexes of the columns whose values are not repeated.
for n=1:size(A,2)
      [C, idx1, idx2] = intersect( B(:,n), A(:,n), 'stable');
end
I do not know if I've been clear. Sorry.
0 Commenti
Risposta accettata
  Stephen23
      
      
 il 13 Giu 2018
        
      Modificato: Stephen23
      
      
 il 13 Giu 2018
  
      This is easy with sort, assuming that both A and B contain exactly the same elements:
>> A = [2;4;4;4];
>> B = [4;2;4;4];
>> [~,ida] = sort(A);
>> [~,idb] = sort(B);
>> [~,ida] = sort(ida);
>> [~,idb] = sort(idb);
>> ida(idb)
ans =
     2
     1
     3
     4
EDIT: use a simple loop to do matrices of any size. This is simpler because C is preallocated so we can index into it using idb:
A = [2,1,2;3,2,5;4,7,5;4,8,10];
B = [4,7,5;2,8,10;4,1,2;3,2,5];
C = nan(size(A));
for k = 1:size(A,2)
    [~,ida] = sort(A(:,k));
    [~,idb] = sort(B(:,k));
    C(idb,k) = ida;
end
And checking the output:
>> C % my code
C =
     3     3     2
     1     4     4
     4     1     1
     2     2     3
>> [3 3 2; 1 4 4; 4 1 1; 2 2 3] % requested output
ans =
     3     3     2
     1     4     4
     4     1     1
     2     2     3
7 Commenti
Più risposte (2)
  Image Analyst
      
      
 il 13 Giu 2018
        Try this:
A= [2 1 2
  3 2 5
  4 7 5
  4 8 10]
B= [4 7 5
  2 8 10
  4 1 2
  3 2 5]
% Find unique numbers in each of the two arrays.
ua = unique(A)
ub = unique(B)
% Check each number in B to see where it lives in A.
for k = 1 : length(ub)
  % Get this number from B
  thisB = ub(k);
  % Find out what rows and columns it shows up at in A
  [rows, columns] = find(A == thisB);
  % Save the number we were looking for into column 1 of the cell array.
  locations{k, 1} = thisB;
  % Save the locations that number was found into column 2 of the cell array.
  locations{k, 2} = [rows, columns];
end
celldisp(locations)
Be sure to read the FAQ https://matlab.wikia.com/wiki/FAQ#What_is_a_cell_array.3F so you understand what I did.
0 Commenti
Vedere anche
Categorie
				Scopri di più su Creating and Concatenating Matrices in Help Center e File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


