瘦矩阵伪逆的最快算法

计算科学 线性代数 最小二乘
2021-12-22 19:19:20

对于性能敏感问题,我需要计算瘦矩阵的伪逆(#rows = 1000–10000, #cols= 10–20)。

我已经采用了传统的 SVD 经济方法。对于某些规模的问题,这会占用我大部分的计算时间。有没有更快的方法?矩阵是稠密的,通常 ( ) 是良条件的ATA

2个回答

如果是满列秩且是非奇异且条件良好的,则可以将伪逆计算为:AATA

A=(ATA)1AT

这比计算 A 的 QR 或 SVD 分解要快,要小心的条件。 AATA

您可以使用 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 经济方法”的意思,只是想我会指出这一点。