2016-10-12 4 views
2

ich eine Matrix wie A haben und ich möchte die Summe jeder Diagonale dieser Matrix berechnen und zeigen es in einem Vektor wie Y.Berechnen Sie die Summe jeder Diagonalen einer Matrix

A=[1 2 3; 4 5 6; 7 8 9] 

Y=[3 8 15 12 7] 

ich das wissen Code

[sum(diag(y,2)),sum(diag(y,1)),sum(diag(y,0)),sum(diag (y,-1)),sum(diag (y,-2))] 

aber ich möchte es als eine Funktion schreiben.

Antwort

5

spdiags genau tun, was Sie wollen:

dsum = sum(spdiags(A)) 

Sie können den Vektor mit fliplr umkehren und eine Funktion erstellen:

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

RESULT

dsum = 

    3 8 15 12 7 
2

dies eine mögliche Lösung :

[r ,c]=size(A); 
idx=bsxfun(@plus,(r:-1:1)',0:c-1); 
s=flipud(accumarray(idx(:),A(:))); 

dies mit spdiags vergleichen, die dieses Verfahren durchführt viel besser in andere Antwort vorgeschlagen. Benchmark:

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 

Ergebnis:

---------bsxfun+accumarray---------- 
Elapsed time is 0.0114651 seconds. 
---------spdiags---------- 
Elapsed time is 8.62041 seconds. 
+0

Great work Bereitstellung einer Benchmark! – Erik

Verwandte Themen