我正在尝试使用 numpy 包将一些 MATLAB 代码转换为 Python,但不确定 eig(A)
和 diag(A)
返回什么,其中 A
是每个我的问题标题的矩阵。
例如,我在 matlab 中有以下代码:
[U,autoval] = eig(S);
[d,i] = sort(-diag(autoval));
% where S is a 2 x 2 matrix, [1.1762 1.2076; 1.2076 1.5364]
在 numpy 中,我可以通过执行以下操作来复制第一行:
autoval, U = np.linalg.eig(S)
我必须修改订单。如果我错了,请纠正我,在 MATLAB 中,第一行 eig(S)
返回的是特征向量,第二行是特征值,这与 python 相反?
但是在 MATLAB 中的第二行中,返回的值如下:
d = [-2.5772 -0.1353];
i = [2 1];
在Python中,运行d后,i = np.msort(- np.diag(autoval))
:
d = array([-0.1353, -2.5772]) # why is the order here different
i = array([0.0, 0.0]) # why is this different
提前致谢,干杯!!!
最佳答案
矩阵的特征值没有内在顺序。 MATLAB 中的两个示例代码或Numpy以不确定的未排序顺序返回特征值。仅确定特征值索引与特征向量矩阵中相应列的关系。
np.msort
仅返回排序后的数组,而不返回包含排序索引的附加数组,如 MATLAB code做。你碰巧没有注意到这一点,因为np.diag
返回一个对角矩阵,排序后可以分为两行 d
和 i
。
如果您想要索引,请使用 np.argsort
.
另请注意,在 Numpy 情况下特征值以一维数组形式返回,但在 MATLAB case 中以二维矩阵形式返回。因此,请调用np.diag
Numpy 情况下不需要。
关于python - 当 A 是矩阵时,eig(A) 和 diag(A) 到底返回什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57633948/