评价此页

torch.linalg.matrix_rank#

torch.linalg.matrix_rank(A, *, atol=None, rtol=None, hermitian=False, out=None) Tensor#

计算矩阵的数值秩。

矩阵秩计算为大于 max(atol,σ1rtol)\max(\text{atol}, \sigma_1 * \text{rtol}) 的奇异值(或在 hermitian= True 时为绝对值的特征值)的数量,其中 σ1\sigma_1 是最大的奇异值(或特征值)。

支持浮点 (float)、双精度浮点 (double)、复数浮点 (cfloat) 和复数双精度浮点 (cdouble) 数据类型。还支持矩阵批处理,如果 `A` 是一个矩阵批处理,则输出具有相同的批处理维度。

如果 hermitian= True,则假设 A 是厄米矩阵(如果为复数)或对称矩阵(如果为实数),但内部不会进行检查。而是仅使用矩阵的下三角部分进行计算。

如果未指定 rtolA 的维度为 (m, n),则相对容差设置为 rtol=max(m,n)ε\text{rtol} = \max(m, n) \varepsilon,其中 ε\varepsilonA 的 dtype 的 epsilon 值(参见 finfo)。如果未指定 rtolatol 被指定为大于零,则 rtol 将被设置为零。

如果 atolrtol 是一个 torch.Tensor,则其形状必须与 torch.linalg.svdvals() 返回的 A 的奇异值形状可广播。

注意

此函数具有与 NumPy 兼容的版本 linalg.matrix_rank(A, tol, hermitian=False)。然而,使用位置参数 tol 已弃用,推荐使用 atolrtol

注意

矩阵秩使用奇异值分解 torch.linalg.svdvals() 来计算(当 hermitian= False(默认)时),并在特征值分解 torch.linalg.eigvalsh() 时计算(当 hermitian= True 时)。当输入在 CUDA 设备上时,此函数将该设备与 CPU 同步。

参数
  • A (Tensor) – 形状为 (*, m, n) 的张量,其中 * 是零个或多个批处理维度。

  • tol (float, Tensor, optional) – [NumPy 兼容] atol 的别名。默认为 None

关键字参数
  • atol (float, Tensor, optional) – 绝对容差值。当 None 时,其被视为零。默认为 None

  • rtol (float, Tensor, optional) – 相对容差值。有关 None 时其取值,请参见上文。默认为 None

  • hermitian (bool) – 表明 A 是否为厄米矩阵(如果为复数)或对称矩阵(如果为实数)。默认为 False

  • out (Tensor, optional) – 输出张量。如果为 None 则忽略。默认为 None

示例

>>> 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]])