Performance 如何为utm格式的网格平均参数避免循环
嗨,我有个小问题。我有1秒时间分辨率的gps数据,以utm(x,y)表示,速度为一年,我希望在20m网格上获得平均速度。我的代码可以工作,但它确实很慢,因为我使用for循环来查找与网格匹配的坐标。感谢您的帮助。 好心的马提亚Performance 如何为utm格式的网格平均参数避免循环,performance,matlab,for-loop,grid,Performance,Matlab,For Loop,Grid,嗨,我有个小问题。我有1秒时间分辨率的gps数据,以utm(x,y)表示,速度为一年,我希望在20m网格上获得平均速度。我的代码可以工作,但它确实很慢,因为我使用for循环来查找与网格匹配的坐标。感谢您的帮助。 好心的马提亚 %x_d is x coordinate %Y_d is y coordinate %x_vec is the xgrid vector definition %y_vec is the ygrid vector definition %s i
%x_d is x coordinate
%Y_d is y coordinate
%x_vec is the xgrid vector definition
%y_vec is the ygrid vector definition
%s is the speed
for i=1:length(vec_x)
for j=1:length(vec_y)
ind = find(x_d<=vec_x(i)+10& x_d>vec_x(i)-10 & y_d<=vec_y(j)+10 & y_d>vec_y(j)-10);
Ad(j,i) = nanmean(s(ind));
end
end
%x\u d是x坐标
%Y_d是Y坐标
%x_vec是xgrid向量定义
%y_vec是ygrid向量定义
%s是速度
对于i=1:长度(vec_x)
对于j=1:长度(vec_y)
ind=find(x_dvec_x(i)-10和y_dvec_y(j)-10);
Ad(j,i)=n均值(s(ind));
结束
结束
A)使用逻辑索引,这样就省去了费时的查找
:您的代码
ind = find(x_d<=vec_x(i)+10& x_d>vec_x(i)-10 & y_d<=vec_y(j)+10 & y_d>vec_y(j)-10);
Ad(j,i) = nanmean(s(ind));
然后你将在你的网格中循环并选择位置。也许arrayfun可以改善这一点
for i=1:length(vec_x)
for j=1:length(vec_y)
ix = ind_x == i & ind_y == j;
Ad(j,i) = nanmean(s(ix));
end
end
使用MATLAB的
histcounts
和accumarray
函数,可以在没有循环的情况下完成。除了可能使用的histcounts
之外,此问题/解决方案几乎与相同
histcounts
有助于解决装箱问题(就是这样)<代码>[~,~,x_idx]=histcounts(x_d,x_vec)告诉您每个x坐标所在的x坐标箱。类似地,对于y\u d,y\u vec
accumarray
适用于重复索引求和(以避免循环)。下面的调用对每个箱子的速度值求和,然后应用@mean
函数对其进行平均。0
告诉accumarray
用零填充空箱子
x_vec = 0:20;
y_vec = 0:20;
x_d = rand(1000,1)*20;
y_d = rand(1000,1)*20;
s = rand(1000,1);
[~,~,x_idx] = histcounts(x_d,x_vec);
[~,~,y_idx] = histcounts(y_d,y_vec);
avg = accumarray([x_idx y_idx],s,[length(x_vec)-1,length(y_vec)-1],@mean,0)
如何定义网格?它是一个20m网格还是将所有数据拆分为20m网格?嗨,这是我的网格定义vec_y=6638960:20:6649860;vec_x=590000:20:606000;IIUC,似乎
ind
将是一个标量或空数组,那么nanmean
的意义是什么?如何使用它索引s
?x\u d、y\u d和s的大小相同。ind在网格内找到点,nanmean在此网格单元中以s为单位平均找到的值。不是x_dvec_x(i)-10&y_dvec_y(j)-10
在每次迭代时都会产生一个标量吗?谢谢,这非常有效,但是对于1个月的1秒数据,它仍然非常慢,在我的计算机上大约需要40分钟。下面来自Geoff的代码大约在1分钟内完成这项工作。ind_x=地板((x_d-min(vec_x))/20)+1;ind_y=楼层((y_d-min(vec_y))/20)+1;非常有用,因为它与[~,~,x_idx]=histcounts(x_d,x_vec)几乎相同;[~,~,y_idx]=历史计数(y_d,y_vec);从下面的代码。非常感谢!这太棒了。超快!这正是我需要的,解释得很好。非常感谢Matthias
for i=1:length(vec_x)
for j=1:length(vec_y)
ix = ind_x == i & ind_y == j;
Ad(j,i) = nanmean(s(ix));
end
end
x_vec = 0:20;
y_vec = 0:20;
x_d = rand(1000,1)*20;
y_d = rand(1000,1)*20;
s = rand(1000,1);
[~,~,x_idx] = histcounts(x_d,x_vec);
[~,~,y_idx] = histcounts(y_d,y_vec);
avg = accumarray([x_idx y_idx],s,[length(x_vec)-1,length(y_vec)-1],@mean,0)