mindspore.scipy.linalg.eigh

mindspore.scipy.linalg.eigh(a, b=None, lower=True, eigvals_only=False, overwrite_a=False, overwrite_b=False, turbo=True, eigvals=None, type=1, check_finite=True)[源代码]

求解复Hermitian矩阵或实对称矩阵的标准或广义特征值问题。

求出 a 的特征值Tensor w 和可选的特征值Tensor v,其中 b 是正定的,使得对于每个特征值 λw 的第i个条目)及其特征向量 viv 的第i列)满足:

              a @ vi = λ * b @ vi
vi.conj().T @ a @ vi = λ
vi.conj().T @ b @ vi = 1

在标准问题中,假设 b 是单位矩阵。

说明

  • Windows平台上还不支持 eigh

  • 如果Tensor是int32、int64类型,它将被强制转换为:mstype.float64类型。

参数:
  • a (Tensor) - 一个shape 为 \((M,M)\) 的复Hermitian矩阵或实对称矩阵,用于计算其特征值和特征向量。

  • b (Tensor, 可选) - 一个shape为 \((M,M)\) 的复Hermitian矩阵或实对称正矩阵。 如果缺省,则假定为传入单位矩阵。 默认值:None

  • lower (bool, 可选) - 控制相关的Tensor数据是取自 ab 的下三角还是上三角。 默认值:True

  • eigvals_only (bool, 可选) - 是否只计算特征值,不计算特征向量。 默认值:False

  • overwrite_a (bool, 可选) - 是否覆盖 a 中的数据(可能会提高性能)。 默认值:False

  • overwrite_b (bool, 可选) - 是否覆盖 b 中的数据(可能会提高性能)。 默认值:False

  • turbo (bool, 可选) - 使用分而治之算法(速度更快,但占用大量内存,仅适用于需要计算全量特征值的广义特征值问题)。 如果不需要计算特征向量,则没有显著影响。 默认值:True

  • eigvals (tuple, 可选) - 要返回的最小和最大(按升序排列)特征值和对应的特征向量的索引: \(0 <= lo <= hi <= M-1\)。 如果缺省,则返回所有特征值和特征向量。 默认值:None

  • type (int, 可选) - 对于广义问题,此参数指定 wv 要解决的问题类型(仅取1、2、3作为可能的输入):

    1 =>     a @ v = w @ b @ v
    2 => a @ b @ v = w @ v
    3 => b @ a @ v = w @ v
    

    对于标准问题,会忽略此关键字。默认值:1

  • check_finite (bool, 可选) - 是否检查输入矩阵是否只包含有限数。 禁用可能会带来性能增益,但如果输入确实包含INF或NaN,则可能会导致问题(崩溃、程序不终止)。 默认值:True

返回:
  • w (Tensor) - 返回shape为 \((N,)\) 的Tensor,其中特征值 \(N (1<=N<=M)\),按升序排列,根据其多样性重复。

  • v (Tensor) - 如果 eigvals_only==False,返回shape为 \((M, N)\) 的Tensor。

异常:
  • RuntimeError - 如果特征值计算不收敛或 b 不是正定矩阵,则会触发报错。 如果输入矩阵不是对称矩阵或Hermitian矩阵,则不会报告错误,但结果将是错误的。

  • TypeError - 如果 a 不是Tensor。

  • TypeError - 如果 low 不是bool类型。

  • TypeError - 如果 eigvals_only 不是bool类型。

  • TypeError - 如果 overwrite_a 不是bool类型。

  • TypeError - 如果 overwrite_b 不是bool类型。

  • TypeError - 如果 turbo 不是bool类型。

  • TypeError - 如果 check_finite 不是bool类型。

  • ValueError - 如果 a 不是2D方阵。

  • ValueError - 如果 b 不为None。

  • ValueError - 如果 eigvals 不是None。

支持平台:

GPU CPU

样例:

>>> import numpy as onp
>>> import mindspore.numpy as mnp
>>> from mindspore import Tensor, dtype
>>> from mindspore.scipy.linalg import eigh
>>> a = Tensor([[6, 3, 1, 5], [3, 0, 5, 1], [1, 5, 6, 2], [5, 1, 2, 2]], dtype.float64)
>>> w, v = eigh(a)
>>> print(onp.allclose(mnp.dot(a, v).asnumpy(), mnp.dot(v, mnp.diag(w)).asnumpy(), 1e-5, 1e-8))
True