2017-04-19 48 views
2

考慮一個N×1向量x和N×N矩陣C.我想評價替代在MATLAB DIAG(X'* C * X)

s = x'*C*x; 

在MATLAB的許多取樣的矢量x,例如考慮x的M個樣本作爲N×M矩陣X;這可以通過使用

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

進行但這是一個差溶液作爲一個M×M矩陣的過程中被分配,並且這打破了M> 1E5。是否有一些matlab功能可以建議替代?

回答

3

執行正確的矩陣乘法C*X,然後執行的elementwise產品,所以沒有不必要的操作完成:

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

如果您的矩陣是複雜的價值,您還需要共軛:

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

好主意!比我的方法好得多 –

0

有點permute -ing和bsxfun -ing將做的伎倆。但請注意,這需要一個尺寸爲N*N×M的中間矩陣。如果NM小,這將是可行的(並且相當快)。否則,你可能需要訴諸使用循環。

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

例子:

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 

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