このネストされたループをベクトル化するには、データを適切に再形成する必要があります。クロス積は特定の次元に沿って実行できるため、実際に行う必要があるのは、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;
シータはループ内の変数に依存していないようですが、acos(X)とdot(v1、v2)は、cross(v1、v2)と同じようにベクトル化されたデータで使用できます。
クロス積関数をその補因子展開で分解したり、ある種の非線形フィルターとして実装しようとしたりすることで、パフォーマンスが向上するかどうかは疑問です。それでも遅すぎる場合は、Parallelツールボックスを確認する必要があります。
お役に立てれば !