How can I extract only the diagonal elements of a matrix product without computing the whole product matrix?
5 views (last 30 days)
Show older comments
Ranjan Sonalkar
on 12 Jun 2014
Commented: VICTOR MIRASIERRA CALLEJA
on 12 Jan 2023
I have nxk matrix (A) and a kxk (B) matrix where n>>k. I want the diagonal terms of A*B*A' in a n-vector. It would be wasteful to compute the whole A*B*A' and then extract the diagonal vector. What is the easy and efficient way to do this?
Thanks.
2 Comments
Accepted Answer
David Young
on 12 Jun 2014
Edited: David Young
on 12 Jun 2014
You could use
sum((a * b) .* a, 2)
A check:
a = rand(1000, 10);
b = rand(10);
max(abs(diag(a*b*a.') - sum((a*b).*a,2)))
And yes, it's quicker:
f1 = @() diag(a * b * a.');
f2 = @() sum((a*b).*a, 2);
timeit(f1)
ans = 0.0104
timeit(f2)
ans = 1.2795e-04
[Edit: my example originally had n < k, which only gave a modest speedup. For n >> k, as required, the speedup is much greater, as expected.]
1 Comment
More Answers (0)
See Also
Categories
Find more on Operating on Diagonal Matrices 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!