考虑N x 1向量x和N x N矩阵C.我想评估
s = x'*C*x;
在matlab中对于矢量x的许多采样,例如,将x的M个样本视为N×M矩阵X;这可以使用
完成S = diag(X'*C*X);
但这是一个很差的解决方案,因为在该过程中分配了M×M矩阵,并且这在M> 1e5时中断。是否有一些matlab功能可以提出替代方案?
答案 0 :(得分:3)
执行正确的矩阵乘法C*X
,然后执行元素乘积,以便不会执行任何不必要的操作:
S = sum(X.*(C*X),1)';
如果你的矩阵是复值的,你还需要结合:
S = sum(conj(X).*(C*X),1).';
答案 1 :(得分:0)
一点点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