【问题标题】:numpy equivalents of eig() and eigs() functions of MatlabMatlab 的 eig() 和 eigs() 函数的 numpy 等价物
【发布时间】:2018-12-17 06:46:38
【问题描述】:

什么是 numpy 或 scipy 等价物

[V, D]= eig(A,-B)

还有

[V, D]= eigs(A,-B, 60, ‘SM')

【问题讨论】:

    标签: matlab numpy scipy


    【解决方案1】:

    看看scipy.linalg.eigscipy.sparse.linalg.eigs

    import scipy.linalg as la
    import scipy.sparse.linalg as sla
    
    # Matlab: [V, D] = eig(A, -B)
    D, V = la.eig(A, -B)
    
    # Matlab: [V, D]= eigs(A, -B, 60, ‘SM')
    D, V = sla.eigs(A, 60, -B, which='SM')
    

    请注意,您通常不会得到完全相同的结果。特征值可能有不同的顺序,特征向量可能有不同的缩放比例(特征向量不是唯一的)。

    【讨论】:

    • 所以,为了尝试,我用 one(3, 3) * 3 表示 A,而 one(3, 3) * 5 表示 B。使用 Matlab; D = [-0.6 ; -0.485446217248779 ;-1.21030705211835e-17]。并使用 Python Scipy:[-6.00000000e-01+0.j, 3.51562903e-01+0.j, -1.41560356e-17+0.j]。所以第一个特征值相同,但第二个特征值有点不同。我可以看到第三个基本上为零。这两个特征值怎么会一样呢?
    • 嗯... scipy 1.1 与 Anaconda 一起安装,我得到了你得到的结果。用scipy的开发版(scipy.__version__'1.2.0.dev0+3385e00'),scipy结果和Matlab一致。我会进一步调查(但不是马上)。与此同时,你能做同样的比较,但矩阵不是那么简并吗?你的AB 都排名第一。
    • 谢谢。我也在使用蟒蛇。要获得开发者版本,我应该只通过 pip 升级吗?
    • 我尝试过使用另一个矩阵 119、119 作为维度,但 sla 部分给出的错误为:in eigs symmetric=False, tol=tol) File "C:\Python\lib\site-packages\scipy\sparse\linalg\eigen\arpack\arpack.py", line 1069, in get_OPinv_matvec return LuInv(A - sigma * M).matvec TypeError: ufunc 'multiply' did not contain a loop with signature matching types dtype('<U32') dtype('<U32') dtype('<U32')。知道为什么会这样吗?
    【解决方案2】:

    我相信您正在寻找的是:numpy.linalg.eig()numpy.linalg.eigh(),但也有 scipy 对应的 scipy.linalg.eig()scipy.linalg.eigh(),它们可能被编译后提供略有不同的行为和性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-27
      • 1970-01-01
      • 2013-11-28
      • 2019-11-30
      • 2011-08-16
      • 1970-01-01
      • 2018-06-30
      相关资源
      最近更新 更多