Ran He老師講他CVPR 2012公式20不是用inv求的,他和學生說過能不用inv,盡量不用,用左除或者右除,解線性方程組。不能受我matlab教材影響,左除或者右除和求inv是不等價的。Feiping Nie的NIPS 2010公布代碼L21R21第45行
實現一個矩陣的逆乘以另外一個矩陣,也用右除。類似實現一個矩陣乘以另外一個矩陣的逆,用左除,不用invhttp://zhidao.baidu.com/question/308277515.html
左除要不要求矩陣可逆?為什么一個不可逆的矩陣a在matlaB中用inv(a)*y不可計算,用a\y就可以計算了?
答:左除不要求矩陣可逆,在matlab中inv(a)*y與a\y并不等同,左除命令有更深的內涵,當a為方陣且可逆時,二者都能得到正確結果,但
左除精度更高,運算數度快(我實驗下來,確實是這樣),特別當A為病態矩陣時,inv(A)*y的計算結果不可靠(不過這種矩陣出現的概率很低),但用左除計算出的結果卻很可靠,因為左除是matlab設計的一個智能算符,他可以智能地選擇算法;當方程為矛盾方程(也就是獨立方程個數多余未知數個數)時,此時顯然沒有精確解,但很多時候我們需要x在最小二乘意義下的解,此時用A\y就能得到x的最小二乘解。
Haiqing Li說他從來不看這些中文的,有些人可能回答得不專業或誤解,到matlab幫助搜索arithmetic operators有左除或者右除詳細解釋
測試例子:
第一個matlab的m文件% 生成數據
rand('state',0);
n = 10000;% 也可設置為1000
A = randn(n,n);
B = randn(n,1);
save MyFile1 A B;
第二個matlab的m文件
% 測試求逆時間
tic;
load MyFile1;
n = size(A,1);
C1 = inv(A'*A+0.01*eye(n))*B;
save MyFile2 C1;
toc;
第三個matlab的m文件
% 測試左除時間
tic;
load MyFile1;
n = size(A,1);
C2 = (A'*A+0.01*eye(n))\B;
save MyFile3 C2;
toc;