假设我有一个矩阵A.我想计算它的2范数/频谱范数。我怎样才能有效地计算出来?
我知道矩阵的2范数等于其最大奇异值。因此,以下MATLAB代码的结果将为零
>> [u,s,v]=svd(A,'econ');
norm(A,2)-s(1,1)
但要知道2范数我必须计算全矩阵A的SVD,有没有有效的方法来计算2范数? MATLAB代码形式的答案将得到很好的回应。
答案 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.
如果您不想使用norm
或eigs
,并且您的矩阵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.