2016-10-12 2 views
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))] 

しかし、私は関数として書きたいと思います。

答えて

5

spdiags正確に何をしたい行うことができます。

dsum = sum(spdiags(A)) 

あなたはfliplrとベクトルを逆にして関数を作成することができます

function dsum = diagsum(A) 
    dsum = fliplr(sum(spdiags(A))); 
end 

RESULT

dsum = 

    3 8 15 12 7 
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. 
+0

偉大な仕事! – Erik

関連する問題