Apache Commons Math:三对角矩阵的特征分解产生错误的结果

时间:2016-08-27 14:05:58

标签: java apache matrix apache-commons apache-commons-math

我试图找到特征值和矩阵V的对角矩阵D,其列是三对角矩阵J的对应右特征向量(其中A V = V D)。我试图在java中实现现有的MATLAB代码,但是我在java中获得的结果与MATLAB中的结果不同(MATLAB结果是正确的结果)。我在MATALB和java的矩阵的google驱动器上创建了一个文件夹,这样你就可以看到差异了。

Variables

Java Code Snippet:

editor.on('change', function() {

Apache Documentation

MATLAB代码:

    RealMatrix J2 = new Array2DRowRealMatrix(j);
    EigenDecomposition eig = new EigenDecomposition(J2);
    RealMatrix V = eig.getV();
    RealMatrix D = eig.getD();

MATLAB Documentation

以下是每个变量的矩阵:

变量J:

J

变量V:

预期:

V Expected

实际值: V Actual

变量D:

预期:

D Expected

实际值: D Actual

1 个答案:

答案 0 :(得分:1)

在这种情况下,你不能说一个结果是正确的,一个是错误的,因为Apache Commons Math和MATLAB的结果实际上是等价的。请记住:

  1. 在这两种情况下,您都可以准确地打印结果。如果将0.5045259791截断为5位小数,则会得到0.50452。结果相同。
  2. 您可以使用包含-1的任何标量多个特征向量,结果也将是特征向量。那是因为一组特征向量是线性子空间在标量乘法 read on Wikipedia下是闭合的。请注意,第一个实际特征向量是最后一个预期乘以-1
  3. 特征分解的不同实现使用不同的约定来对结果中的特征值进行排序。实际的D似乎与预期的顺序相反。
  4. 由于双精度浮点数的浮点算术的舍入导致的相对误差的machine epsilon上限为2.22e-16 。您可以看到接近机器epsilon的数字的实际和预期结果之间看似很大的差异。这对于2种不同的特征分解实现是可以预期的。