对于性能敏感问题,我需要计算瘦矩阵的伪逆(#rows = 1000–10000, #cols= 10–20)。
我已经采用了传统的 SVD 经济方法。对于某些规模的问题,这会占用我大部分的计算时间。有没有更快的方法?矩阵是稠密的,通常 ( ) 是良条件的
对于性能敏感问题,我需要计算瘦矩阵的伪逆(#rows = 1000–10000, #cols= 10–20)。
我已经采用了传统的 SVD 经济方法。对于某些规模的问题,这会占用我大部分的计算时间。有没有更快的方法?矩阵是稠密的,通常 ( ) 是良条件的
如果是满列秩且是非奇异且条件良好的,则可以将伪逆计算为:
。
这比计算 A 的 QR 或 SVD 分解要快,要小心的条件。
您可以使用 QR 分解“前端”高/瘦矩阵的 SVD,然后仅对剩余的小/方矩阵 R 进行 SVD。这是基于此想法计算伪逆的 matlab 代码片段:
clear all
close all
% Make input.
I = 10000;
J = 20;
A = rand(I,J);
% Pseudoinverse B := pinv(A)
tic
B = pinv(A);
toc
norm(A - A*B*A,'fro')
norm(B - B*A*B,'fro')
% Pseudoinverse C := V*inv(S)*(Q*U)', based on qr(A) and svd(R).
tic
[Q,R] = qr(A,0);
[U,S,V] = svd(R);
C = V*inv(S)*(Q*U)';
toc
norm(A - A*C*A,'fro')
norm(C - C*A*C,'fro')
示例输出:
Elapsed time is 0.0120101 seconds.
ans = 6.7672e-013
ans = 2.1392e-016
Elapsed time is 0.00999999 seconds.
ans = 6.7672e-013
ans = 2.1392e-016
也许它快一点?虽然老实说,SVD 的高质量实现已经包含了这个想法。这可能就是您所说的“传统 SVD 经济方法”的意思,只是想我会指出这一点。