Get the diagonal without calculating the explicit matrix

1 visualizzazione (ultimi 30 giorni)
Dear all:
I am trying to calculate a diagonal of a matrix (denoted A), which is formed by multiplying two large-dimensional matrices (denoted as B*C).
A naive way to do it is: first, calculating explicitly A = B*C, then get diagonal out from A. However, the first step takes forever to run due to the high-dimension of B and C. But the only thing I need is the diagonal of A.
Another straightforward way in my mind is: I could create a loop by calculating each element of the diagonal of A one by one. It will surely save a lot of time, but I am not sure if this is the most efficient way.
I am wondering if anyone knows a faster/smarter way to calculate it.
Thank you very much in advance!
Best,
Long
  1 Commento
Matt J
Matt J il 26 Mar 2020
Modificato: Matt J il 26 Mar 2020
The best approach will depend on the dimensions of the matrices, and whether they are of sparse-type or not.

Accedi per commentare.

Risposta accettata

Matt J
Matt J il 26 Mar 2020
Modificato: Matt J il 26 Mar 2020
Assuming B*C results in a square matrix,
diagonal=sum(B.' .* C, 1);
  8 Commenti
Long Hong
Long Hong il 26 Mar 2020
Thank you the cyclist! Do you have any insight in doing the transpose quicker? I am a bit confused here.
Matt J
Matt J il 26 Mar 2020
Modificato: Matt J il 26 Mar 2020
the cyclist means you might avoid the transpose by loading data column-wise instead of row-wise when you first build B.

Accedi per commentare.

Più risposte (1)

the cyclist
the cyclist il 26 Mar 2020
Here is one way:
% Make up some inputs
N = 4;
B = rand(N);
C = rand(N);
% Calculate the diagonal
A_diag = 0;
for nr = 1:N
A_diag = A_diag + B(:,nr).*C(nr,:)';
end

Categorie

Scopri di più su Operating on Diagonal Matrices in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by