How can I extract only the diagonal elements of a matrix product without computing the whole product matrix?

3 vues (au cours des 30 derniers jours)
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.

Réponse acceptée

David Young
David Young le 12 Juin 2014
Modifié(e) : David Young le 12 Juin 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.]

Plus de réponses (0)

Catégories

En savoir plus sur Operating on Diagonal Matrices dans Help Center et File Exchange

Tags

Produits

Community Treasure Hunt

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

Start Hunting!

Translated by