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

조회 수: 1 (최근 30일)
Ham Man
Ham Man 2024년 3월 13일
댓글: Matt J 2024년 3월 14일
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
Ham Man
Ham Man 2024년 3월 14일
편집: Ham Man 2024년 3월 14일
Thank you Matt, yes that should be counted once as well.
Matt J
Matt J 2024년 3월 14일
Then see my answer below.

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

답변 (1개)

Matt J
Matt J 2024년 3월 14일
편집: Matt J 2024년 3월 14일
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

카테고리

Help CenterFile Exchange에서 Matrices and Arrays에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by