How to make up the diagonal summation without for loop and with the fastest way!

A =
1 7 13
2 8 14
3 9 15
4 10 16
5 11 17
6 12 18
B =
1, (2+7), (3+8+13), (4+9+14), (5+10+15) ... (12+17), 18
How to make the B vector?
Vector-wise would be good to perform the enhancement of computational time?

 採用された回答

Andrei Bobrov
Andrei Bobrov 2014 年 4 月 1 日
A =[ 1 7 13
2 8 14
3 9 15
4 10 16
5 11 17
6 12 18];
B = sum(spdiags(rot90(A)));

2 件のコメント

Sean de Wolski
Sean de Wolski 2014 年 4 月 1 日
Nice!
Andrei Bobrov
Andrei Bobrov 2014 年 4 月 1 日
Thank you Sean.

サインインしてコメントする。

その他の回答 (3 件)

Azzi Abdelmalek
Azzi Abdelmalek 2014 年 4 月 1 日
編集済み: Azzi Abdelmalek 2014 年 4 月 1 日
A =[ 1 7 13
2 8 14
3 9 15
4 10 16
5 11 17
6 12 18]
[n,m]=size(A);
B=fliplr(A);
out=zeros(1,m+n-1);
for k=-n+1:m-1
out(k+n)=sum(diag(B,k));
end
out=fliplr(out)
Mischa Kim
Mischa Kim 2014 年 4 月 1 日
編集済み: Mischa Kim 2014 年 4 月 1 日
Hyunchul, something like
fA = fliplr(A);
B = fliplr(arrayfun(@(i) sum(diag(fA,i)),-length(A(:,1))+1:length(A(1,:))-1));
Sean de Wolski
Sean de Wolski 2014 年 4 月 1 日
And just for fun (requires Image Processing):
B = zeros(size(A));
B(1) = 1;
B2 = bwdist(B,'cityblock')+1;
v = accumarray(B2(:),A(:))
Use Azzi's solution.

カテゴリ

ヘルプ センター および File ExchangeOperating on Diagonal Matrices についてさらに検索

製品

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by