Fast computation of diagonal elements

3 views (last 30 days)
Saurabh
Saurabh on 5 Nov 2013
Commented: Matt J on 5 Nov 2013
I have two matrices, A of size m-by-n and B of size m-by-m. I need to quickly compute the digonal elements of (A'*B*A). Here m is of order 100 while n is of order 10000.
How would I do it ? Doing diag(A'*B*A) will be slow.
Neither B nor A is diagonal. they are full matrices.

Accepted Answer

Matt J
Matt J on 5 Nov 2013
Edited: Matt J on 5 Nov 2013
diagonal = sum(A.*(B*A),1);
  2 Comments
Matt J
Matt J on 5 Nov 2013
It works. But you'll have overhead from the transpositions.

Sign in to comment.

More Answers (2)

Sean de Wolski
Sean de Wolski on 5 Nov 2013
m = 100;
n = 10000;
A = rand(m,n);
B = rand(m);
timeit(@()diag(A'*B*A)) % R2013b
ans = 0.8128
So it takes slightly less than a second on my Win7x64 laptop. How many times do you need to do this computation?
  2 Comments
Saurabh
Saurabh on 5 Nov 2013
I need to compute this for possibly 200 iterations.
Sean de Wolski
Sean de Wolski on 5 Nov 2013
Edited: Sean de Wolski on 5 Nov 2013
I.e. less than three minutes total? I would just do the above 200x and go get a cup of coffee while MATLAB is crunchin'

Sign in to comment.


Azzi Abdelmalek
Azzi Abdelmalek on 5 Nov 2013
Edited: Azzi Abdelmalek on 5 Nov 2013
This will reduce the time
S=A'*B;
d1=arrayfun(@(x) S(x,:)*A(:,x),1:n);

Categories

Find more on Operating on Diagonal Matrices in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!