How to avoid counting elements in each row of matrix multiple times?

1 vue (au cours des 30 derniers jours)
Ham Man
Ham Man le 13 Mar 2024
Commenté : Matt J le 14 Mar 2024
I have written this function to calculate the location distribution in a form of a grid pattern(2D map of distribution).
x&y which are coordinates of each points are as follows:
X: is a matrix that each row contins a x position of points which creats an individual trajectory.(number of rows)
Y: is a matrix that each row contins a y position of points corresponding to x positions.
Note: each rows of X or Y contains a trajectory with a specified length and the rest of row is filled with NaNs:
X=[0.3 0.18 1.2 2.3 nan nan nan ,....,nan ;
0.1 0.12 0.5 2.6 nan nan nan ,....,nan ;
.......]
the same thing for Y.
=====================================
Question: the N matrix calculated in "for loop" below counts points multiple times if they are belong to one trajectory(one row of X) but pass through one grid multiple times. how can I modify the code to avoid counting points multiple times if they belong to the same trajectory but pass through the grid multiple times?
=====================================
function [binx,biny,dx,dy,N] = myfunc(X,Y,Nbin,[Xmin Xmax Ymin Ymax])
%Nbin=number of bins to create 2D matrix of N
lim(1)=Xmin;
lim(2)=Xmax;
lim(3)=Ymin;
lim(4)=Ymax;
% change to 1D arrays
X = X(:);
Y = Y(:);
%exclude nans
X = X(find(~isnan(X)));
Y = Y(find(~isnan(Y)));
%variable range
if isempty(lim)
in1 = min(X(:));
en1 = max(X(:));
in2 = min(Y(:));
en2 = max(Y(:));
else
in1 = lim(1);
en1 = lim(2);
in2 = lim(3);
en2 = lim(4);
end
%initialise bin sizes
dx = abs(en1-in1)/Nbin;
dy = abs(en2-in2)/Nbin;
binx = [in1+dx/2:dx:en1-dx/2];
biny = [in2+dy/2:dy:en2-dy/2];
%compute N matrix of 2D-map
N = zeros(Nbin,Nbin);
for ii = 1:length(X)
%check if variables fall within the domain
if X(ii) >= binx(1)-dx/2 && X(ii) <= binx(end)+dx/2 && Y(ii) >= biny(1)-dy/2 && Y(ii) <= biny(end)+dy/2
%find bin
indx = find(binx+dx/2 >= X(ii));
indx = indx(1);
indy = find(biny+dy/2 >= Y(ii));
indy = indy(1);
N(indy,indx) = N(indy,indx) + 1;
end
end
  12 commentaires
Ham Man
Ham Man le 14 Mar 2024
Modifié(e) : Ham Man le 14 Mar 2024
Thank you Matt, yes that should be counted once as well.
Matt J
Matt J le 14 Mar 2024
Then see my answer below.

Connectez-vous pour commenter.

Réponses (1)

Matt J
Matt J le 14 Mar 2024
Modifié(e) : Matt J le 14 Mar 2024
Xedges=linspace(Xmin,Xmax, Nbin+1);
Yedges=linspace(Ymin,Ymax, Nbin+1);
N=0;
for i=1:height(X)
deltaN = histcounts2(X(i,:),Y(i,:),Xedges,Yedges);
N=N+logical(deltaN);
end

Catégories

En savoir plus sur Matrices and Arrays dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by