find duplicated rows in matlab without for loop

조회 수: 28 (최근 30일)
Mina Mino
Mina Mino 2023년 7월 21일
이동: Matt J 2023년 7월 21일
Hello Friedns,
I have a very large matrix with 2 columns. I need to find the location of duplicated rows (the position of them) . However, I don't want to solve this problem with a for loop because I've tried it before (see the attached code) and it takes a long time. I'm looking for an alternative way to do this. I would be grateful if you could suggest me an idea.
Best,
Mina
x = [File(:,1) File(:,2)];
Grid=unique(x,'rows');
for j=1:length(DD)
idx=find(day_of_year==DD(j));
File2=File(idx,:);
for g=1:length(Grid)
[index1] = (ismember(File2(:,[1 2]),Grid(g,:),'rows'));
idx2=find(index1==1);
Total=[Total;Grid(g,1) Grid(g,2) DD(j) mean(File2(idx2,3)) mean(File2(idx2,4)) mean(File2(idx2,5)) mean(File2(idx2,6))];
end
end

채택된 답변

Matt J
Matt J 2023년 7월 21일
편집: Matt J 2023년 7월 21일
[~,I]=unique(x,'rows');
locations=setdiff(1:height(x),I) %locations of duplicate rows
  댓글 수: 2
Mina Mino
Mina Mino 2023년 7월 21일
Hi Matt J,
Many thanks for your help! It seems that for each line your code is only finding the position of one of the duplicated lines. However, there are more than one duplicates for each row. How can I find all duplicate rows of each row?
Thanks in advance for your answer and time.
Matt J
Matt J 2023년 7월 21일
편집: Matt J 2023년 7월 21일
It seems that for each line your code is only finding the position of one of the duplicated lines.
I don't think so. It should return the indices of all rows that have been seen before. As you can see below, the final locations list includes all rows except for 1 and 3, which is where a new row is encountered.
x=[ 1 2;
1 2;
0 4;
1 2;
0 4
0 4];
[~,I]=unique(x,'rows');
locations=setdiff(1:height(x),I) %locations of duplicate rows
locations = 1×4
2 4 5 6

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Walter Roberson
Walter Roberson 2023년 7월 21일
이동: Matt J 2023년 7월 21일
The third output of unique gives the "group number" for each entry. There are different ways of handling that. one of ways is
[unique_rows, ~, ic] = unique(x,'rows');
appears_in_rows = accumarray(ic, (1:size(x,1)).', [], @(v) {v});
T = table(unique_rows, appears_in_rows);
This would create a table in which the first variable is each unique row, and the second variable is a cell array of row indices that are that unique row. The cell array will always have at least one entry, but might have more.
  댓글 수: 1
Mina Mino
Mina Mino 2023년 7월 21일
이동: Matt J 2023년 7월 21일
@Walter Roberson Thansk for your help! I exactly need it:)
Best,

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

태그

제품


릴리스

R2021a

Community Treasure Hunt

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

Start Hunting!

Translated by