嗨,我有一个小问题。我有1秒的时间分辨率gps数据,在utm(x,y),速度为一年,我想在20米的网格上进行速度平均。我的代码可以工作,但它非常慢,因为我使用循环来找到与网格匹配的坐标。任何帮助表示赞赏。 亲切的问候马蒂亚斯
%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
答案 0 :(得分:1)
使用MATLAB的histcounts
和accumarray
函数可以完成无循环。此问题/解决方案几乎与this question/solution重复,但可能使用histcounts
。
histcounts
适用于分箱问题(这是)。 [~,~,x_idx]=histcounts(x_d,x_vec)
告诉您每个x坐标所在的x-bin。同样适用于y_d, y_vec
。
accumarray
适用于重复索引求和(避免循环)。下面的调用将每个bin的速度值相加,然后应用@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)
答案 1 :(得分:0)
A)使用逻辑索引,消除了耗时的find
:您的代码
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));
等于更快的
ix = 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(ix));
B)尝试使用已知的网格大小信息直接访问正确的网格元素。从偏移量和元素大小(20)可以推断:
ind_x = floor((x_d - min(vec_x))./20) + 1;
ind_y = floor((y_d - min(vec_y))./20) + 1;
然后你将遍历你的网格并选择位置。也许这可以通过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