フィルターのクリア

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 Center および File ExchangeMatrices and Arrays についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by