当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python PyTorch symeig用法及代码示例


本文简要介绍python语言中 torch.symeig 的用法。

用法:

torch.symeig(input, eigenvectors=False, upper=True, *, out=None)

参数

  • input(Tensor) -大小为 的输入张量,其中 * 是零个或多个由对称矩阵或 Hermitian 矩阵组成的批量维度。

  • eigenvectors(bool,可选的) -控制是否必须计算特征向量

  • upper(布尔值,可选的) -控制是否考虑上三角区域或下三角区域

关键字参数

out(tuple,可选的) -(Tensor, Tensor) 的输出元组

返回

一个命名元组(特征值,特征向量)包含

  • 特征值(Tensor): 形状(*, m) .以升序排列的特征值。

  • 特征向量(Tensor): 形状(*, m, m) .如果eigenvectors=False,它是一个空张量。否则,该张量包含input.

返回类型

(TensorTensor)

此函数返回实数对称或复数 Hermitian 矩阵input 或其批次的特征值和特征向量,由命名元组(特征值,特征向量)表示。

此函数计算 input 的所有特征值(和向量),使得

布尔参数 eigenvectors 定义特征向量和特征值或仅特征值的计算。

如果是 False ,则仅计算特征值。如果是 True ,则计算特征值和特征向量。

由于输入矩阵input 应该是对称的或厄米特矩阵,因此默认情况下只使用上三角部分。

如果 upperFalse ,则使用下三角部分。

警告

torch.symeig() 已弃用,取而代之的是 torch.linalg.eigh() ,并将在未来的 PyTorch 版本中删除。默认行为已从默认使用矩阵的上三角部分更改为使用下三角部分。

L, _ = torch.symeig(A, upper=upper) 应替换为

UPLO = "U" if upper else "L"
L = torch.linalg.eigvalsh(A, UPLO=UPLO)

L, V = torch.symeig(A, eigenvectors=True, upper=upper)应该替换为

UPLO = "U" if upper else "L"
L, V = torch.linalg.eigh(A, UPLO=UPLO)

注意

特征值按升序返回。如果input是一批矩阵,则以升序返回该批中每个矩阵的特征值。

注意

无论原始步幅如何,返回的矩阵 V 都将被转置,即步幅为 V.contiguous().transpose(-1, -2).stride()

警告

在通过输出后退时需要格外小心。这种操作只有在所有特征值都不同时才是稳定的,并且 越小越不稳定。

例子:

>>> a = torch.randn(5, 5)
>>> a = a + a.t()  # To make a symmetric
>>> a
tensor([[-5.7827,  4.4559, -0.2344, -1.7123, -1.8330],
        [ 4.4559,  1.4250, -2.8636, -3.2100, -0.1798],
        [-0.2344, -2.8636,  1.7112, -5.5785,  7.1988],
        [-1.7123, -3.2100, -5.5785, -2.6227,  3.1036],
        [-1.8330, -0.1798,  7.1988,  3.1036, -5.1453]])
>>> e, v = torch.symeig(a, eigenvectors=True)
>>> e
tensor([-13.7012,  -7.7497,  -2.3163,   5.2477,   8.1050])
>>> v
tensor([[ 0.1643,  0.9034, -0.0291,  0.3508,  0.1817],
        [-0.2417, -0.3071, -0.5081,  0.6534,  0.4026],
        [-0.5176,  0.1223, -0.0220,  0.3295, -0.7798],
        [-0.4850,  0.2695, -0.5773, -0.5840,  0.1337],
        [ 0.6415, -0.0447, -0.6381, -0.0193, -0.4230]])
>>> a_big = torch.randn(5, 2, 2)
>>> a_big = a_big + a_big.transpose(-2, -1)  # To make a_big symmetric
>>> e, v = a_big.symeig(eigenvectors=True)
>>> torch.allclose(torch.matmul(v, torch.matmul(e.diag_embed(), v.transpose(-2, -1))), a_big)
True

相关用法


注:本文由纯净天空筛选整理自pytorch.org大神的英文原创作品 torch.symeig。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。