【问题标题】:Matlab loops vectorizationMatlab循环向量化
【发布时间】:2012-04-29 10:23:02
【问题描述】:

这是一段 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
...

【问题讨论】:

  • 什么是px? theta 的定义似乎与所有其他内容无关
  • 您想要实现的输出是什么?使用嵌套的 for 循环,您可能需要某种 2d 输出,但无法按照示例说明来判断

标签: matlab loops vectorization


【解决方案1】:

要对这个嵌套循环进行矢量化,您需要正确地重塑数据。叉积可以沿某个维度执行,因此您真正需要做的就是将 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 工具箱。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2015-07-06
    • 2013-02-18
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 2016-03-11
    相关资源
    最近更新 更多