Find repeating rows in a matrix and replace with zeros
2 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Savannah D
am 3 Nov. 2020
Kommentiert: Monika Jaskolka
am 3 Nov. 2020
I have a large matrix (5683384x2 double) containing xy-coordinates of an ROI mask. If an xy-coordinate does not repeat enough times, I want to set the row to zeros.
For example if my matrix is [9 10; 9 10; 9 10; 9 10; 9 10; 7 12; 3 4; 3 4; 3 4; 3 4]. I want to replace rows that do not repeat 3 times, so [7 12] would become [0 0]. Is there any way to do this?
0 Kommentare
Akzeptierte Antwort
Monika Jaskolka
am 3 Nov. 2020
Bearbeitet: Monika Jaskolka
am 3 Nov. 2020
This can probably be optimized, but it works to replace rows that don't occur more times than the set threshold, in this case 3 times.
M = [9 10; 9 10; 9 10; 9 10; 9 10; 7 12; 3 4; 3 4; 3 4; 3 4; 7 12];
threshold = 3;
[~, ~, ic] = unique(M, 'rows', 'stable');
numOccurances = accumarray(ic, 1);
idxToDelete = false(size(M,1), 1);
for i = 1:length(numOccurances)
if numOccurances(i) < threshold
duplicateRows = find(ic==i);
idxToDelete(duplicateRows) = true;
end
end
M(idxToDelete,:) = 0;
If you want to delete the rows entirely, you can replace the last line with this:
M(idxToDelete,:) = []; % Alternatively, delete rows
2 Kommentare
Monika Jaskolka
am 3 Nov. 2020
No problem! If the answer worked for you, please press the "Accept this answer" button.
Weitere Antworten (1)
Bruno Luong
am 3 Nov. 2020
Bearbeitet: Bruno Luong
am 3 Nov. 2020
M = [9 10; 9 10; 9 10; 9 10; 9 10; 7 12; 3 4; 3 4; 3 4; 3 4; 7 12];
minlgt = 3; % keep all rows consecutively repeated at least minlgt times
i = find([true; any(diff(M,1,1),2); true]);
lgt = diff(i);
removed = lgt<minlgt;
M(repelem(i(removed),lgt(removed)),:) = 0
0 Kommentare
Siehe auch
Kategorien
Mehr zu Resizing and Reshaping Matrices finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!