0

这是一段 Matlab 代码。它工作得很慢。有没有办法让它更快地工作?我想不出矢量化它的方法。也许它可以写成某种过滤器?

...
for uu=2:length(x)-2;
    for vv= 2:length(y)-2;

     P1=[x(uu+1) y(vv) temp(uu+1,vv)];
     P2=[x(uu) y(vv+1) temp(uu,vv+1)];
     P3=[x(uu-1),y(vv) temp(uu-1,vv)];
     P4=[x(uu) y(vv-1) temp(uu,vv-1)];


     cr=cross((P1-P3),(P2-P4));

     cr=cr/norm(cr);
     theta=acos(dot([0,0,1],px))*180/pi;
     ...
 end
end
...
4

1 回答 1

0

要矢量化这个嵌套循环,您需要正确地重塑数据。叉积可以沿某个维度执行,因此您真正需要做的就是将 P1 ... P4 重塑为包含有序数据的向量。

请注意,您的操作有一个“十字形”内核。P1 可以是底部,P3 可以是顶部,P2 可以是右侧,P4 可以是左侧。假设向量 x 和 y 只是采样点 (temp) 的坐标,则这些向量中的每一个都可以表示如下:

[x,y] = meshgrid(1:size(temps,1),1:size(temp,2)); % Create a sampling grid or replicate the one you have

tmp1 = x(3:end,2:end-1);
tmp2 = y(3:end,2:end-1);
tmp3 = temp(3:end,2:end-1);
P1 = [tmp1(:), tmp2(:), tmp3(:)] % Vectorization

tmp1 = x(2:end-1,3:end);
tmp2 = y(2:end-1,3:end);
tmp3 = temp(2:end-1,3:end);
P2 = [tmp1(:), tmp2(:), tmp3(:)];

tmp1 = x(1:end-2,2:end-1);
tmp2 = y(1:end-2,2:end-1);
tmp3 = temp(1:end-2,2:end-1);
P3 = [tmp1(:), tmp2(:), tmp3(:)];

tmp1 = x(2:end-1,1:end-2);
tmp2 = y(2:end-1,1:end-2);
tmp3 = temp(2:end-1,1:end-2);
P4 = [tmp1(:), tmp2(:), tmp3(:)];

V1 = P1 - P3;
V2 = P2 - P4;

CR = cross(V1,V2);
NRM = (CR(:,1).^2 + CR(:,2).^2 + CR(:,3).^2).^0.5; % norm(X) cannot be vectorized
CR = CR./NRM;

Theta 似乎不依赖于循环中的任何变量,但 acos(X) 和 dot(v1,v2) 可用于矢量化数据,与 cross(v1,v2) 相同。

我怀疑您是否可以通过在其辅因子扩展中分解叉积函数或尝试将其实现为某种非线性滤波器来获得任何性能提升。如果它仍然太慢,你应该看看 Parallel 工具箱。

希望这可以帮助 !

于 2012-04-30T05:25:33.273 回答