Search Comments and Ratings

go

   
Date File Comment by Comment Rating
05 Nov 2013 sumDiag Sum over each diagonal (or anti-diagonal) in a matrix Author: Marcus Björk Marcus Björk

That's true Sven. I added 3D matrix support now, if anyone has an application for that.
In my case the code was used in an iterative algorithm, in which case the matrix is not known beforehand and cannot be stored in a 3D matrix. I figured the code was nice enough to make a function out of it and upload it here.

Comment only
02 Nov 2013 sumDiag Sum over each diagonal (or anti-diagonal) in a matrix Author: Marcus Björk Marcus Björk

Forgot to mention: If you need to compute the sum of diagonals for several matrices of the same size (in another loop), which was the application at hand, this for-loop free implementation is also faster (well, the inlined version). See below:

Test code:
%Input
K=1000;
A=randn(1000,100);

%Common
[N,M]=size(A);

%% Method 1
tic;
d = 1-N:M-1;
out = zeros(M+N-1,1,class(A));

for k=1:K
for p = 1:length(d)
out(p) = sum(diag(A,d(p)));
end
A=randn(N,M);
end
toc

%% Method 2
tic;
Amod=zeros(N+M-1,M);
logVec = [false(M-1,1);true(N,1);false(M-1,1)];
indMat = bsxfun(@plus, (1:M+N-1)',0:M-1);
logMat = logVec(indMat);

for k=1:K
Amod(logMat)=A;
sumVec=sum(Amod,2);
A=randn(N,M);
end
toc

>>
Elapsed time is 2.632392 seconds.
Elapsed time is 1.307457 seconds.

Comment only
02 Nov 2013 sumDiag Sum over each diagonal (or anti-diagonal) in a matrix Author: Marcus Björk Marcus Björk

Thanks for your comment Sven!
I had the for-loop implementation already, which is trivial, but was posed with the problem of solving it without a for-loop. Hence, I wrote this code. (Which could perhaps be optimized further?)
Didn't actually check which was faster, and I should probably make a note of this in the description.

Furthermore, you don't get the anti-diagonals by transposing. But rot90(A) works and is almost as fast as using the extra input.

Comment only
01 Nov 2013 Vandermonde matrix, vander() function extension Adds functionality to the original MATLAB vander() function. Author: Marcus Björk Marcus Björk

Thanks for the comments guys! Indeed, its a bad idea to REPLACE vander with this function, so I changed the name and made a note in the text. However, one of the points was to use the normal definition, so I won't change that. I also added bsxfun instead of the for-loop, that was just bad...

Comment only

Contact us