How to remove rows in a nested for loop?
2 views (last 30 days)
Show older comments
I have a matrix Detected_center and a matrix Original_center with in each row a x and y coordinate. I want to compare each time one row of the Detected_center matrix with all the rows in the Original_center matrix and calculate the distance. If the row of the Detected_center is paired with a row of the Original_center as the minimal distance is within a threshold, I want that this row is removed from the Original_center matrix for the sake of computational time.
Can any help me out how to do this in a save way? The beneath way is not save as the nested for loop should change in length.
Threshold = 0.2
for i = 1:length(Detected_center)
for j = 1:length(Original_center)
Distance(j,1) = ...
end
[Min_Distance, position] = min(Distance);
if Min_Distance < Threshold
TP = TP + 1;
Original_center(position,:) = []; %Remove row from matrix, as it is coupled
else
FP = FP + 1;
end
end

Blue center is from the matrix Detected_center, and the red centers are the centers of the matrix Original_center. The distances are calculated from the blue center to all red centers with pythagoras. If the distance between the red center which is the closest to the blue center falls within the threshold, it should be removed from the matrix Original_center.
Accepted Answer
Matt J
on 20 Jan 2022
Edited: Matt J
on 20 Jan 2022
It should start with the column (and therefore the Detected_center point) with the overall shortest distance to a Original_center point and then move on to the next Detected_center
This new processing rule can be implemented as follows,
Distances=pdist2(Original_center,Detected_center);
[M,N]=size(Distances);
discard=false(M,1);
while any(isfinite(Distances),'all')
[d,Rows]=min(Distances,[],1);
[dmin,col]=min(d);
if dmin<Threshold
row=Rows(col);
discard(row)=1;
Distances(row,:)=inf;
end
Distances(:,col)=inf;
end
Original_center(discard,:)=[];
TP=nnz(discard);
FP=M-TP;
More Answers (2)
Matt J
on 17 Jan 2022
For Euclidean distance,
discard=any( pdist2(Original_center,Detected_center)<Threshold ,2);
Original_center(discard,:)=[];
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!