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;

シータはループ内の変数に依存していないようですが、acos(X)とdot(v1、v2)は、cross(v1、v2)と同じようにベクトル化されたデータで使用できます。

クロス積関数をその補因子展開で分解したり、ある種の非線形フィルターとして実装しようとしたりすることで、パフォーマンスが向上するかどうかは疑問です。それでも遅すぎる場合は、Parallelツールボックスを確認する必要があります。

お役に立てれば !

于 2012-04-30T05:25:33.273 に答える