난의 샘플링 많은 매트랩대안
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 기능이 있나요?
난의 샘플링 많은 매트랩대안
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 기능이 있나요?
올바른 행렬 곱셈 C*X
수행하고 elementwise 제품 수행 준다 :
S = sum(X.*(C*X),1)';
매트릭스가 복소수 인 경우 공액을 사용해야합니다.
S = sum(conj(X).*(C*X),1).';
약간 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
좋은 아이디어! 내 접근 방식보다 훨씬 낫다. –