Filter löschen
Filter löschen

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

1 Ansicht (letzte 30 Tage)
Ham Man
Ham Man am 13 Mär. 2024
Kommentiert: Matt J am 14 Mär. 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 Kommentare
Ham Man
Ham Man am 14 Mär. 2024
Bearbeitet: Ham Man am 14 Mär. 2024
Thank you Matt, yes that should be counted once as well.

Melden Sie sich an, um zu kommentieren.

Antworten (1)

Matt J
Matt J am 14 Mär. 2024
Bearbeitet: Matt J am 14 Mär. 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

Kategorien

Mehr zu Matrices and Arrays 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!

Translated by