考慮一個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功能可以建議替代?
考慮一個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功能可以建議替代?
執行正確的矩陣乘法C*X
,然後執行的elementwise產品,所以沒有不必要的操作完成:
S = sum(X.*(C*X),1)';
如果您的矩陣是複雜的價值,您還需要共軛:
S = sum(conj(X).*(C*X),1).';
有點permute
-ing和bsxfun
-ing將做的伎倆。但請注意,這需要一個尺寸爲N*N
×M
的中間矩陣。如果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).';
例子:
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
好主意!比我的方法好得多 –