1

何百回も実行する必要があるこの関数があります。for関数を高速化するために削除しようとしているループが含まれています。誰かがループを単一行コマンドで置き換えるのを手伝ってくれませんか?

nn = 4;
T = [5 1 2; 5 2 3; 5 3 4; 5 4 1];
p = [0 0; 1 0; 1 1; 0 1; 0.5 0.5];
A = zeros(nn,1);    
for i=1:nn
    sctr = T(i,:); pT = p(sctr,:);
    A(i) = 1/2*det([pT,ones(3,1)]);  
end

おそらく、それを削除detして実際の式に置き換えて、行列式を計算すると役立つでしょうか?

4

2 に答える 2

2

あなたが持っているForループソリューションはおそらく最速です。その他のオプションは次のとおりです。

B = [p(T',:),ones(3*size(T,1),1)] 
C= mat2cell(B,[3,3,3,3],3)
D= cellfun(@det,C);

Dまたは、この式の代わりに書くこともできます

D = arrayfun(@(x) det(C{x}), 1 : size(C, 1));

等...

于 2013-03-23T08:46:29.137 に答える
0

これでうまくいくと思います(環境がないのでテストできませんでした)

pT = p(T(1:nn,:),:);
A = 1/2 * det([pT, ones(3, 1)]);

上記のコードから明らかに1行のコードを実行できますが、これは読みにくくなります。

それが機能せず、forループを維持する場合は、少なくともマトリックスの事前割り当て(A、pT、およびsctrの場合)を検討してください。これにより、プログラムが高速化されます。

于 2013-03-23T07:54:15.370 に答える