行列の各対角の合計を計算し、私はこの行列の各対角の合計を計算し、私はAのような行列を持つ
A=[1 2 3; 4 5 6; 7 8 9]
Y=[3 8 15 12 7]
私が知っているY.のようなベクターにそれを表示したいですコード
[sum(diag(y,2)),sum(diag(y,1)),sum(diag(y,0)),sum(diag (y,-1)),sum(diag (y,-2))]
しかし、私は関数として書きたいと思います。
行列の各対角の合計を計算し、私はこの行列の各対角の合計を計算し、私はAのような行列を持つ
A=[1 2 3; 4 5 6; 7 8 9]
Y=[3 8 15 12 7]
私が知っているY.のようなベクターにそれを表示したいですコード
[sum(diag(y,2)),sum(diag(y,1)),sum(diag(y,0)),sum(diag (y,-1)),sum(diag (y,-2))]
しかし、私は関数として書きたいと思います。
これは明らかな解決策:
[r ,c]=size(A);
idx=bsxfun(@plus,(r:-1:1)',0:c-1);
s=flipud(accumarray(idx(:),A(:)));
この方法は、はるかに良好に機能する他の回答で提案されているspdiags
とこれを比較します。 ベンチマーク:
A = rand(1000);
disp('---------bsxfun+accumarray----------')
tic
[r ,c]=size(A);
idx=bsxfun(@plus,(r:-1:1)',0:c-1);
s=flipud(accumarray(idx(:),A(:)));
toc
disp('---------spdiags----------')
tic
dsum = fliplr(sum(spdiags(A)));
toc
結果:ベンチマークを提供
---------bsxfun+accumarray----------
Elapsed time is 0.0114651 seconds.
---------spdiags----------
Elapsed time is 8.62041 seconds.
偉大な仕事! – Erik