替代matlab中的diag(X'* C * X)

时间:2017-04-19 23:16:35

标签: matlab matrix vectorization matlab-deployment

考虑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功能可以提出替代方案?

2 个答案:

答案 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的中间矩阵。如果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