如何以utm格式平均网格参数,避免循环

时间:2015-09-17 14:08:57

标签: performance matlab for-loop grid

嗨,我有一个小问题。我有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

2 个答案:

答案 0 :(得分:1)

使用MATLAB的histcountsaccumarray函数可以完成无循环。此问题/解决方案几乎与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