Numpy与Mathematica特征向量结果差异问题解析及验证
矩阵特征向量计算:Numpy与Mathematica的结果差异解析
计算示例
Numpy代码及结果
from numpy.linalg import eig import numpy as np A = np.array([[1,2],[3,4]]) eval, evec = eig(A) print("Eigenvectors:", evec)
输出结果:
Eigenvectors: [[-0.82456484 -0.41597356] [ 0.56576746 -0.90937671]]
Mathematica代码及结果
A = {{1, 2}, {3, 4}}; {eval, evec} = Eigensystem[A]; N[evec]
输出结果:
{{0.457427, 1.}, {-1.45743, 1.}}
差异原因与结论
特征向量的非唯一性:特征向量的核心性质是,乘以任意非零常数后仍然是原矩阵的特征向量。Numpy返回的是归一化后的特征向量(每个向量的L2范数为1),而Mathematica返回的是将最后一个元素缩放为1的特征向量,二者本质等价。
存储格式差异:
- Numpy的
eig函数返回的特征向量矩阵是按列存储的,每一列对应一个特征向量; - Mathematica的
Eigensystem返回的特征向量是按行存储的,每一行对应一个特征向量。
- Numpy的
用户最初用Numpy结果画波函数出错,并非结果不正确,只是没有对Numpy返回的特征向量矩阵进行转置,导致用列向量的方式处理了行向量数据。
Numpy中匹配Mathematica格式的方法
如果需要得到和Mathematica格式一致的特征向量,只需两步:
- 转置Numpy的特征向量矩阵,将列向量转为行向量;
- 按需求缩放特征向量(比如将每个向量的最后一个元素调整为1)。
示例代码:
from numpy.linalg import eig import numpy as np A = np.array([[1,2],[3,4]]) eval, evec = eig(A) # 转置得到行向量形式的特征向量 evec_rows = evec.T # 将每个特征向量缩放为最后一个元素为1的形式 scaled_evec = evec_rows / evec_rows[:, [-1]] print("匹配Mathematica格式的特征向量:\n", scaled_evec)
运行后输出:
匹配Mathematica格式的特征向量: [[-1.45742711 1. ] [ 0.45742711 1. ]]
和Mathematica的结果仅顺序不同(特征向量的顺序由特征值顺序决定,二者特征值顺序一致即可)。
内容的提问来源于stack exchange,提问作者Sophile
相关产品推荐
相关产品推荐

