torch.linalg 矩阵秩
- torch.linalg.matrix_rank(A, *, atol=None, rtol=None, hermitian=False, out=None) → Tensor
-
计算矩阵的秩。
矩阵的秩是通过计算大于$\max(\text{atol}, \sigma_1 * \text{rtol})$ 阈值的奇异值(或当
hermitian
为 True 时,绝对值后的特征值)的数量来确定的。其中$\sigma_1$ 是最大的奇异值(或特征值)。支持浮点型、双精度型、复数浮点型和复数双精度型的数据类型作为输入。还支持矩阵的批量处理,如果
A
是一组矩阵,那么输出将具有相同的批处理维度。如果
hermitian
= True,假定矩阵A
是复数情况下的 Hermite 矩阵或实数情况下的对称矩阵,但不会在内部进行验证。相反,在计算中仅使用矩阵的下三角部分。如果未指定
rtol
,并且A
是一个维度为 (m, n) 的矩阵,则相对容差设置为 $\text{rtol} = \max(m, n) \varepsilon$。其中 $\varepsilon$ 是A
数据类型的 epsilon 值(参见finfo
)。如果未指定rtol
,但指定了大于零的atol
,则将rtol
设置为零。如果
atol
或rtol
是一个torch.Tensor
,其形状必须可以广播到矩阵A
的奇异值的形状,这些奇异值由torch.linalg.svdvals()
返回。注意
此函数有一个与 NumPy 兼容的变体 linalg.matrix_rank(A, tol, hermitian=False)。然而,使用位置参数
tol
已被弃用,建议改用atol
和rtol
。注意
矩阵的秩通过奇异值分解
torch.linalg.svdvals()
计算得出,当hermitian
为 False(默认设置)时;若hermitian
为 True,则使用特征值分解torch.linalg.eigvalsh()
。当输入数据位于 CUDA 设备上时,此函数会将该设备与 CPU 同步。- 参数
- 关键字参数
示例:
>>> A = torch.eye(10) >>> torch.linalg.matrix_rank(A) tensor(10) >>> B = torch.eye(10) >>> B[0, 0] = 0 >>> torch.linalg.matrix_rank(B) tensor(9) >>> A = torch.randn(4, 3, 2) >>> torch.linalg.matrix_rank(A) tensor([2, 2, 2, 2]) >>> A = torch.randn(2, 4, 2, 3) >>> torch.linalg.matrix_rank(A) tensor([[2, 2, 2, 2], [2, 2, 2, 2]]) >>> A = torch.randn(2, 4, 3, 3, dtype=torch.complex64) >>> torch.linalg.matrix_rank(A) tensor([[3, 3, 3, 3], [3, 3, 3, 3]]) >>> torch.linalg.matrix_rank(A, hermitian=True) tensor([[3, 3, 3, 3], [3, 3, 3, 3]]) >>> torch.linalg.matrix_rank(A, atol=1.0, rtol=0.0) tensor([[3, 2, 2, 2], [1, 2, 1, 2]]) >>> torch.linalg.matrix_rank(A, atol=1.0, rtol=0.0, hermitian=True) tensor([[2, 2, 2, 1], [1, 2, 2, 2]])