不同的矩阵乘法导致MATLAB和Python导致不同的特征向量

Different matrix multiplication result in MATLAB and Python leads different eigenvectors

提问人:galib 提问时间:8/11/2023 最后编辑:galib 更新时间:8/17/2023 访问量:64

问:

我正在尝试将我的MATLAB代码转换为Python。我必须将两个矩阵相乘并计算乘法结果的特征向量和特征值。下面是两个矩阵

P = [0.153833459882762  0.733552631578947;
     -0.911184210526316 -0.153833459882762];
Q = [0.649519052838329 3.09722222222222;
    -3.84722222222222 -0.649519052838329];

我在MATLAB中得到以下结果

>>PQ = P*Q
PQ =
         -2.72222222222222                         0
     -1.11022302462516e-16         -2.72222222222222

>>[eigvec, eigval] = eig(PQ)
eigvec =
                         0         0.983547166232033
                         1         0.180651520328333
eigval =
         -2.72222222222222                         0
                         0         -2.72222222222222

Python 使用 PyTorch 给出以下结果

import torch
P = torch.tensor([[0.153833459882762, 0.733552631578947],
     [-0.911184210526316, -0.153833459882762]],dtype = torch.complex64)
Q = torch.tensor([[0.649519052838329, 3.09722222222222],
    [-3.84722222222222, -0.649519052838329]],dtype = torch.complex64)
PQ = P@Q
print(PQ)
torch.linalg.eig(PQ)

输出是

tensor([[-2.7222e+00+0.j,  2.9802e-08+0.j],
        [ 1.1921e-07+0.j, -2.7222e+00+0.j]])
torch.return_types.linalg_eig(
eigenvalues=tensor([-2.7222+0.j, -2.7222+0.j]),
eigenvectors=tensor([[0.-0.j, 1.+0.j],
        [1.+0.j, 0.-0.j]]))

使用 NumPy 的特征值和特征向量为

import numpy as np
np.linalg.eig(P@Q)

numpy 的 EIG 结果为

(array([-2.7222+0.j, -2.7222+0.j], dtype=complex64),
 array([[ 0.4472-0.j, -0.4472+0.j],
        [ 0.8944+0.j,  0.8944+0.j]], dtype=complex64))

很明显,MATLAB 和 Python 的乘法结果是不同的。此外,我还为 MATLAB、Pytorch 和 Numpy 提供了不同的特征向量。Python 和 MATLAB 之间的区别可能是因为浮点运算的数值精度。但是,它正在完全改变结果。为什么 Pytorch 和 Numpy 具有不同的特征向量?有没有技术可以将 Python 的结果与 MATLAB 的结果保持一致?

python numpy matlab 矩阵乘法 特征向量

评论

3赞 Cris Luengo 8/11/2023
(1) 这些不是您在 MATLAB 中获得的特征向量。(2) Python 结果似乎是使用 PyTorch 在单精度浮点中计算的?请发布一个最小的可重现示例,以便我们了解您做了什么。如果我使用 NumPy 在 Python 中重复您的 MATLAB 计算,我会得到相同的结果(足够接近)。
0赞 galib 8/17/2023
@CrisLuengo,我已经编辑了这个问题。希望它有所帮助。MATLAB、Pytorch 和 Numpy 给出了完全不同的特征向量。
0赞 Cris Luengo 8/17/2023
是的,在 PyTorch 和 NumPy 中,您都在使用单精度浮点数进行计算(因为是单精度)。将 和 定义为具有双精度浮点数 ( 或 ) 的 NumPy 数组,您将在那里获得更好的结果。complex64PQfloat64complex128
0赞 Cris Luengo 8/17/2023
此外,当我运行您的MATLAB代码周时,我得到的结果与您得到的结果不同。
0赞 galib 8/18/2023
在 Pytoch/Numpy 中使用双精度 () 会给出相同的结果。谢谢,@CrisLuengo。顺便说一句,您从 MATLAB 中得到了什么结果?complex128

答: 暂无答案