Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 如何为utm格式的网格平均参数避免循环_Performance_Matlab_For Loop_Grid - Fatal编程技术网

Performance 如何为utm格式的网格平均参数避免循环

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

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