scipy.linalg.

matrix_balance#

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

计算用于行/列平衡的对角相似变换。

平衡尝试通过应用相似变换来均衡行和列的1-范数,使得矩阵元素的幅度变化反映在缩放矩阵中。

此外,如果启用,矩阵会首先进行置换以隔离矩阵的上三角部分,并且,如果也启用了缩放,则只有剩余的子块会进行缩放。

文档假设数组参数具有指定的“核心”形状。然而,此函数的数组参数可能在核心形状前额外添加了“批处理”维度。在这种情况下,该数组被视为低维切片的批处理;有关详细信息,请参阅批处理线性操作

参数:
A(n, n) array_like

用于平衡的方阵数据。

permutebool, optional

选择器,用于定义在缩放之前是否也对 A 进行置换。

scalebool, optional

选择器,用于开启和关闭缩放。如果为 False,矩阵将不会被缩放。

separatebool, optional

此项将从返回完整变换矩阵切换为返回包含两个独立的一维置换和缩放数组的元组。

overwrite_abool, optional

此参数直接传递给 xGEBAL。本质上,它将结果覆盖到数据中。这可能会提高空间效率。详情请参阅 LAPACK 手册。默认为 False。

返回:
B(n, n) ndarray

平衡后的矩阵。

T(n, n) ndarray

一个可能经过置换的对角矩阵,其非零项是2的整数次幂,以避免数值截断误差。

scale, perm(n,) ndarray

如果 separate 关键字设置为 True,则不返回上述数组 T,而是以元组形式分别给出缩放向量和置换向量,且不分配完整数组 T

注意

平衡后的矩阵满足以下等式

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

缩放系数被近似到最接近的2的幂,以避免舍入误差。

该算法对于特征值和矩阵分解特别有用,并且在许多情况下,它已经被各种 LAPACK 例程调用。

该算法基于众所周知的[1]技术,并已修改以处理特殊情况。有关 LAPACK v3.5.0 后实现的详细信息,请参阅[2]。在此版本之前,在某些特殊情况下,平衡实际上会使条件数变差。有关此类示例,请参阅[3]

此代码是 LAPACK 的 xGEBAL 例程族用于矩阵平衡的封装。

在版本 0.19.0 中添加。

参考文献

[1]

B.N. Parlett 和 C. Reinsch,“平衡矩阵以计算特征值和特征向量”,Numerische Mathematik,第13(4)卷,1969年,DOI:10.1007/BF02165404

[2]

R. James, J. Langou, B.R. Lowery,“关于矩阵平衡和特征向量计算”,2014年,arXiv:1401.5766

[3]

D.S. Watkins。《平衡有害案例》。Electron. Trans. Numer. Anal,第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. ]])