2017-04-19 5 views
2

ein N x 1 Vektor x Betrachten und eine N-Matrix C N x IAlternative zu diag (X '* C * X) in Matlab

s = x'*C*x; 

in Matlab für viele der abgetasteten bewerten möchten Vektor x, z Betrachte M Abtastwerte von x als eine N × M-Matrix X; dies kann

S = diag(X'*C*X); 

aber das ist eine schlechte Lösung als M x M-Matrix durchgeführt werden soll, in dem Prozess zugeordnet werden, und das bricht für M> 1e5. Gibt es Matlab-Funktionen, die eine Alternative vorschlagen können?

Antwort

3

Führen Sie die richtige Matrixmultiplikation C*X und dann element Produkte durchführen, so dass keine unnötigen Operationen durchgeführt werden:

S = sum(X.*(C*X),1)'; 

Wenn Ihre Matrizen komplexwertig sind, müssen Sie auch konjugieren:

+0

Gute Idee! Viel besser als mein Ansatz –

0

Ein wenig permute -ing und bsxfun -ing wird den Trick tun. Es ist jedoch zu beachten, dass dies eine Zwischenmatrix der Größe N*N × M erfordert. Dies ist möglich (und ziemlich schnell), wenn N klein ist im Vergleich zu M. Andernfalls müssen Sie möglicherweise auf Schleifen zurückgreifen.

T = reshape(bsxfun(@times, permute(conj(X), [1 3 2]), permute(X, [3 1 2])), [], M); 
S = sum(bsxfun(@times, C(:), T), 1).'; 

Beispiel:

M = 5; 
N = 6; 
C = rand(N,N) + 1j*rand(N,N); 
X = rand(N,M) + 1j*rand(N,M); 
T = reshape(bsxfun(@times, permute(conj(X), [1 3 2]), permute(X, [3 1 2])), [], M); 
S = sum(bsxfun(@times, C(:), T), 1).'; 
S_check = diag(X'*C*X); 
S./S_check % may not be exactly equal due to numerical accuracy 

gibt

>> S./S_check 
ans = 
    1.000000000000000 + 0.000000000000000i 
    1.000000000000000 - 0.000000000000000i 
    1.000000000000000 - 0.000000000000000i 
    1.000000000000000 + 0.000000000000000i 
    1.000000000000000 + 0.000000000000000i