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

2 views (last 30 days)
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?

Accepted Answer

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

More Answers (3)

Azzi Abdelmalek
Azzi Abdelmalek on 1 Apr 2014
Edited: Azzi Abdelmalek on 1 Apr 2014
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 on 1 Apr 2014
Edited: Mischa Kim on 1 Apr 2014
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 on 1 Apr 2014
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.

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Products

Community Treasure Hunt

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

Start Hunting!