Find matrix rows that have 3 common values, store the rows and the values

1 次查看(过去 30 天)
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 个评论
Pseudoscientist
Pseudoscientist 2019-4-16
Yes the following result is correct, displayig the result in ascending order is very good

请先登录,再进行评论。

采纳的回答

Matt J
Matt J 2019-4-16
编辑:Matt J 2019-4-17
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 个评论
Pseudoscientist
Pseudoscientist 2019-4-17
编辑:Matt J 2019-4-17
Hmm quite interesting, the logic seems to work but when the results are plotted, the result is not that great..
Imagine a sphere filled with a tetrahedral mesh, the tetras have values 1 and 2. Now where the tetras face each other, we should have a triangular surface of values 3.
The first image is what should be. The second image is what is calculated as triangles with values 3. The third image is the sphere.
The first image has about 43k triangles and
the second image
tri_3 = find(result(:,4)==4);
result1 = result(tri_3,:);
has about 3k

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Creating and Concatenating Matrices 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by