scipy.linalg.

matrix_balance#

scipy.linalg.matrix_balance(A, permute=True, scale=True, separate=False, overwrite_a=False)[source]#

計算用於行/列平衡的對角相似轉換。

平衡嘗試通過應用相似轉換來均衡行和列的 1-範數,使得矩陣條目的量級變化反映到縮放矩陣。

此外,如果啟用,矩陣會先被置換以隔離矩陣的上三角部分,並且再次地,如果也啟用了縮放,則僅對剩餘的子區塊進行縮放。

平衡後的矩陣滿足以下等式

\[B = T^{-1} A T\]

縮放係數近似為最接近的 2 的冪,以避免捨入誤差。

參數:
A(n, n) array_like

用於平衡的方陣資料。

permutebool, optional

選擇器,用於定義是否在縮放之前也執行 A 的置換。

scalebool, optional

選擇器,用於開啟和關閉縮放。如果為 False,則不會縮放矩陣。

separatebool, optional

此選項從返回轉換的完整矩陣切換為返回兩個獨立的 1-D 置換和縮放陣列的元組。

overwrite_abool, optional

這直接傳遞給 xGEBAL。 基本上,將結果覆寫到資料。 它可能會提高空間效率。 請參閱 LAPACK 手冊以瞭解詳細資訊。 預設值為 False。

返回:
B(n, n) ndarray

平衡後的矩陣

T(n, n) ndarray

一個可能經過置換的對角矩陣,其非零條目是 2 的整數冪,以避免數值截斷誤差。

scale, perm(n,) ndarray

如果 separate 關鍵字設定為 True,則不返回上面的陣列 T,而是將縮放和置換向量作為元組單獨給出,而無需分配完整的陣列 T

Notes

此演算法對於特徵值和矩陣分解特別有用,並且在許多情況下,它已經被各種 LAPACK 常式調用。

該演算法基於著名的 [1] 技術,並已進行修改以處理特殊情況。 有關自 LAPACK v3.5.0 以來已實作的詳細資訊,請參閱 [2]。 在此版本之前,在某些極端情況下,平衡實際上可能會使條件變差。 有關此類範例,請參閱 [3]

此程式碼是 LAPACK 的 xGEBAL 常式系列的包裝函式,用於矩陣平衡。

在版本 0.19.0 中新增。

參考文獻

[1]

B.N. Parlett 和 C. Reinsch,“Balancing a Matrix for Calculation of Eigenvalues and Eigenvectors”,Numerische Mathematik,Vol.13(4),1969,DOI:10.1007/BF02165404

[2]

R. James、J. Langou、B.R. Lowery,“On matrix balancing and eigenvector computation”,2014,arXiv:1401.5766

[3]

D.S. Watkins。 A case where balancing is harmful. Electron. Trans. Numer. Anal, Vol.23, 2006。

範例

>>> import numpy as np
>>> from scipy import linalg
>>> x = np.array([[1,2,0], [9,1,0.01], [1,2,10*np.pi]])
>>> y, permscale = linalg.matrix_balance(x)
>>> np.abs(x).sum(axis=0) / np.abs(x).sum(axis=1)
array([ 3.66666667,  0.4995005 ,  0.91312162])
>>> np.abs(y).sum(axis=0) / np.abs(y).sum(axis=1)
array([ 1.2       ,  1.27041742,  0.92658316])  # may vary
>>> permscale  # only powers of 2 (0.5 == 2^(-1))
array([[  0.5,   0. ,  0. ],  # may vary
       [  0. ,   1. ,  0. ],
       [  0. ,   0. ,  1. ]])