Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ApacheCommons数学:三对角矩阵的特征分解产生错误的结果_Java_Apache_Matrix_Apache Commons_Apache Commons Math - Fatal编程技术网

Java ApacheCommons数学:三对角矩阵的特征分解产生错误的结果

Java ApacheCommons数学:三对角矩阵的特征分解产生错误的结果,java,apache,matrix,apache-commons,apache-commons-math,Java,Apache,Matrix,Apache Commons,Apache Commons Math,我试图找到特征值的对角矩阵D和矩阵V,它们的列是三对角矩阵对应的右特征向量(其中AV=VD)。我试图用java实现现有的MATLAB代码,但是我用java得到的结果与MATLAB中的结果不同(MATLAB结果是正确的结果)。我已经在谷歌硬盘上创建了MATALB和java的矩阵文件夹,这样你就可以看到它们的区别了 Java代码片段: RealMatrix J2 = new Array2DRowRealMatrix(j); EigenDecomposition eig = new

我试图找到特征值的对角矩阵D和矩阵V,它们的列是三对角矩阵对应的右特征向量(其中AV=VD)。我试图用java实现现有的MATLAB代码,但是我用java得到的结果与MATLAB中的结果不同(MATLAB结果是正确的结果)。我已经在谷歌硬盘上创建了MATALB和java的矩阵文件夹,这样你就可以看到它们的区别了

Java代码片段:

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

MATLAB代码:

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

以下是每个变量的矩阵:

变量J:

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

变量V:

    RealMatrix J2 = new Array2DRowRealMatrix(j);
    EigenDecomposition eig = new EigenDecomposition(J2);
    RealMatrix V = eig.getV();
    RealMatrix D = eig.getD();
[V,D]=eig(J);
预期:

实际:

变量D:

    RealMatrix J2 = new Array2DRowRealMatrix(j);
    EigenDecomposition eig = new EigenDecomposition(J2);
    RealMatrix V = eig.getV();
    RealMatrix D = eig.getD();
[V,D]=eig(J);
预期:

实际:

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

  • 在这两种情况下,您都可以以特定的精度打印结果。如果将
    0.5045259791
    截断为5位小数,则得到
    0.50452
    。同样的结果
  • 您可以将一个特征向量与任何标量(包括
    -1
    )相乘,结果也将是一个特征向量。这是因为特征向量集是线性子空间,在标量乘法下是闭合的。请注意,第一个实际特征向量是最后一个期望值乘以
    -1
  • 特征值分解的不同实现对结果中特征值的排序使用不同的约定。实际的
    D
    的顺序似乎与预期的相反
  • 由于双精度浮点数的浮点运算中的舍入而导致的相对误差上限为
    2.22e-16
    。对于接近机器ε的数字,您可以看到实际结果和预期结果之间似乎存在很大差异。这是两种不同的特征分解实现的预期结果

  • 请尽量把所有相关的信息都写在问题里。特别是J矩阵和预期输出。