【问题标题】:What exactly does eig(A) and diag(A) return where A is a matrixeig(A) 和 diag(A) 究竟返回什么,其中 A 是一个矩阵
【发布时间】:2019-12-29 05:32:23
【问题描述】:

我正在尝试使用 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

提前谢谢,干杯!!!

【问题讨论】:

    标签: python matlab numpy matrix vector


    【解决方案1】:

    矩阵的特征值没有内在顺序。 MATLABNumpy 中的两个示例代码都以不确定的未排序顺序返回特征值。仅确定特征值索引与特征向量矩阵中相应列的关系。

    np.msort 只返回排序后的数组,而不是像MATLAB code 那样包含排序索引的附加数组。你碰巧没有注意到这一点,因为np.diag 返回一个对角矩阵,排序后可以分成两行di

    如果您想拥有索引,请使用np.argsort

    另请注意,在 Numpy 情况下,特征值作为一维数组返回,但在 MATLAB case 中返回二维矩阵。因此,在 Numpy 案例中不需要调用 np.diag

    【讨论】:

    • 谢谢!!!是的,你是对的。我没有注意到 matlab 中的 sort 也返回排序索引。但不知何故,MATLAB 中的eig 函数和np.linalg.eig 也返回不同的值?请参考我上面的代码,在 Python 中,U = array([ [-0.7574, -0.6528], [0.6529, -0.7575] ] ]),而在 MATLAB 中,U = [-0.7575, 0.6529; 0.6529, 0.7575]。你能解释一下吗?
    • @Alex_Zhong 这些结果是匹配的。舍入略有不同,第二个特征向量(第二列)相差一个减号。特征向量的标量倍数仍然是相同特征值的特征向量,乘以-1 也不会影响归一化。因此,这两个结果同样有效,并且不能保证得到其中一个。
    • @unevent_mark,干杯人。 MATLAB 和 Python 的另一个让我感到困惑的区别是,假设我有一个数组 Vt = [ [-0.087, 0.125, 0.236, -0.238], [-0.383, -0.503, -0.983, -1.1 ] ]。在 python 中,Vt[1, :] 返回一个 4 * 1 数组 [-0.383, -0.503, -0.983, -1.1 ],而在 MATLAB 中 Vt(1, :) 返回一个 1 * 4 数组 [ -0.0867 0.1253 0.2358 -0.2377 ]。如何处理尺寸差异?
    猜你喜欢
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 2017-11-21
    • 2016-07-01
    • 2022-11-25
    相关资源
    最近更新 更多