Find matrix rows that have 3 common values, store the rows and the values
    5 views (last 30 days)
  
       Show older comments
    
Suppose I have a 500000x5 matrix and for each row I need to find rows that have 3 common elements within the first 4 elements of the row but different 5th element and store the common values and the sum of the 5th elements to a new matrix.
For example:
1 2 3 4 1
1 2 3 5 2
Would yield a row like this in a new matrix
1 2 3 3
Of course this could be done with 2 nested for loops and if statements but the calculation takes like 10 hours. I need something that takes a few minutes even with 500k rows.. Is this possible with Matlab? 
5 Comments
Accepted Answer
  Matt J
      
      
 on 16 Apr 2019
        
      Edited: Matt J
      
      
 on 17 Apr 2019
  
      I'll call your original 5 column matrix A.
 D=cell(4,1);
 a5=A(:,5);
 As=sort(A(:,1:4),2);  
 for i=1:4  %small loop
   Triangles{i}=  [As(:, setdiff(1:4,i)),a5];
 end
 Q=cell2mat(Triangles);
 result=consol(Q(:,1:3),Q(:,4));
    function out=consol(B,b)
       [C,~,j]=unique(B,'rows');
       nc=size(C,1);
       c=accumarray(j,b,[nc,1]);
       out=[C,c];
        keep=histcounts(j,1:nc+1)>1;
        out=out(keep,:);
    end
9 Comments
More Answers (0)
See Also
Categories
				Find more on Surface and Mesh Plots 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!




