2017-02-14 5 views
1

행렬 A가 있다고 가정하고 2 표준/스펙트럼 표준을 계산하려고합니다. 어떻게 이것을 효율적으로 계산할 수 있습니까?매트릭스의 2- 노름을 효율적으로 계산하는 방법은 무엇입니까?

매트릭스의 2- 노름은 가장 큰 특이 값과 같습니다. 나는 전체 행렬 A의 SVD를 계산해야이 규범을 알고 있지만, 그래서, 다음 MATLAB 코드의 결과가 0

>> [u,s,v]=svd(A,'econ'); 
norm(A,2)-s(1,1) 

될 것입니다,이 규범을 계산하기 위해 어떤 효과적인 방법은 무엇입니까? MATLAB 코드의 형태로 응답하면 많은 도움이 될 것입니다.

+0

's (0,0)'는 유효하지 않은 MATLAB 구문입니다. 이 코드를 실행 했습니까? – Adriaan

+0

'norm (A, 2) '의 문제점은 무엇입니까? 일반적으로, Matlab에 내장 함수가있는 경우, 특히 대수 행렬 –

+0

에 대해 가장 빨리 수행 할 수 있지만 대용량 행렬의 경우에는 좋지 않습니다. – user3086871

답변

3

norm 및 임의의 데이터

A = randn(2000,2000); 
tic; 
n1 = norm(A) 
toc; 

와이 예제는 하나의 대칭 행렬 A'*A의 (최대) 고유 값 (또는 A*A'을 찾아 eigs을 시도 할 수 있습니다

n1 = 89.298 
Elapsed time is 2.16777 seconds. 

제공 그것을 을 경우 A 직사각형의 경우는 더 작음). 그것은 Lanczos iteration 방법을 사용합니다.

tic; 
B = A'*A; % symmetric positive-definite. B = A*A' if it is smaller 
n2 = sqrt(eigs(B, 1)), 
toc 

는 출력 : 당신이 norm 또는 eigsA 좋은 특성 (제대로 분리 특이 값)가 당신의 매트릭스를 사용하지 않을 경우

n2 = 89.298 
Elapsed time is 0.311942 seconds. 

것은, 당신이 그것을 대략적인 시도 할 수 있습니다 power iteration 방법은

tic; 
B = A'*A; % or B = A*A' if it is smaller 
x = B(:,1); % example of starting point, x will have the largest eigenvector 
x = x/norm(x); 
for i = 1:200 
    y = B*x; 
    y = y/norm(y); 
    % norm(x - y); % <- residual, you can try to use it to stop iteration 
    x = y; 
end; 
n3 = sqrt(mean(B*x./x)) % translate eigenvalue of B to singular value of A 
toc 

같은 임의의 매트릭스 (되지 특히 양호한 특성)에 대한 012 범정확한 해결책 :

n3 = 89.420 
Elapsed time is 0.428032 seconds. 
+0

A '* A; 행렬 차원이 100 x 4m 이므로 공분산 행렬을 만들면 메모리 제한을 초과하므로이 작업을 수행 할 수 없습니다. 이 상황에서 어떻게해야합니까? – user3086871

+1

더 나은 :'B = A * A'' 다음 – ibancg

+0

친절한 답변을 주셔서 감사합니다! 마음에 들지 않으면 다른 질문이 있습니다. 두 치수가 모두 커지면 4m x 4m가됩니다. – user3086871