대안

2017-04-19 1 views
2

난의 샘플링 많은 매트랩대안

s = x'*C*x; 

평가하려는 것 인 N X 1 벡터 X와 N의 X N 행렬 C. 고려 벡터 x, 예. x의 M 샘플을 N × M 행렬 X로 간주한다. 이것은

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

를 사용하여 수행하지만,이 과정에서 할당 된 M의 X 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 x M 인 중간 행렬이 필요합니다. 이것은 에 비해 N이 작 으면 실현 가능합니다 (그리고 매우 빠름). 그렇지 않으면 루프를 사용해야 할 수도 있습니다.

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