如何有效地计算矩阵的2范数?

时间:2017-02-14 10:30:27

标签: matlab matrix svd norm

假设我有一个矩阵A.我想计算它的2范数/频谱范数。我怎样才能有效地计算出来?

我知道矩阵的2范数等于其最大奇异值。因此,以下MATLAB代码的结果将为零

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

但要知道2范数我必须计算全矩阵A的SVD,有没有有效的方法来计算2范数? MATLAB代码形式的答案将得到很好的回应。

1 个答案:

答案 0 :(得分:3)

此示例包含norm和随机数据

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

给出

n1 =  89.298
Elapsed time is 2.16777 seconds.

您可以尝试eigs仅查找对称矩阵A'*A(或A*A'的一个(最大)特征值,如果<{>}小于A矩形)。它使用Lanczos iteration方法。

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

输出:

n2 =  89.298
Elapsed time is 0.311942 seconds.

如果您不想使用normeigs,并且您的矩阵A具有良好的属性(正确分隔的奇异值),您可以尝试使用一个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

对于相同的随机矩阵(不是特别好的属性),给出~0.1%准确的解决方案:

n3 =  89.420
Elapsed time is 0.428032 seconds.