[英]Ways around pinv([inf])=NaN in Octave/Matlab
我正在使用類似Matlab的程序Octave 3.8.1。 我想將1/x
推廣到x
可能是標量或矩陣的情況。 用inv(x)
或pinv(x)
替換1/x
適用於大多數x
,除了:
octave:1> 1/inf
ans = 0
octave:2> pinv([inf])
ans = NaN
octave:3> inv([inf])
warning: inverse: matrix singular to machine precision, rcond = 0
ans = Inf
之后是否應該將NaN轉換為0,以使其正常工作? 還是我錯過了什么? 謝謝!
Matore和octave的pinv
的基礎是Moore-Penrose偽逆 ,它是通過與inv
函數完全不同的算法實現的。 更具體地說,使用奇異值分解 ,它需要使用有限值矩陣(它們也不能是sparse
)。 您沒有說矩陣是否為正方形。 pinv
的真正用途是解決非正方形系統( 超 定或欠定 )。
但是,無論矩陣的尺寸如何,都不應在應用程序中使用pinv
或inv
。 相反,您應該使用mldivide
( 八度 , Matlab ),即反斜杠運算符\\
。 這是效率更高且數值上更可靠的。
A1 = 3;
A2 = [1 2 1;2 4 6;1 1 3];
A1inv = A1\1
A2inv = A2\eye(size(A2))
mldivide
函數也可以處理矩形矩陣,但是與pinv
相比,對於欠定系統,您將獲得不同的答案,因為這兩種方法使用不同的方法來選擇解決方案。
A3 = [1 2 1;2 4 6]; % Underdetermined
A4 = [1 2;2 4;1 1]; % Overdetermined
A3inv = A3\eye(min(size(A3))) % Compare to pinv(A3), different answer
A4inv = A4\eye(max(size(A4))) % Compare to pinv(A4), same answer
如果運行上面的代碼,您將看到與pinv(A3)
返回的結果相比, A3inv
結果略有不同。 但是,兩者都是有效的解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.