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