javajama矩阵问题

javajama矩阵问题,java,math,matrix,jama,Java,Math,Matrix,Jama,我用它来计算奇异值。它工作得很好。如果我通过平方矩阵。例如2x2或3x3等矩阵。但是当我通过一些像2x3或4x8这样的东西时 错误。我用了他们所有的例子。他们有不同的构造函数来执行此任务。我的第二个问题是,我是usded 3x3矩阵,它给出了 double[][] vals = {{1.,1.,0},{1.,0.,1.},{1.,3.,4.},{6.,4.,8.}}; Matrix A = new Matrix(vals); 它产生了以下错误: Exception in thread "m

我用它来计算奇异值。它工作得很好。如果我通过平方矩阵。例如2x2或3x3等矩阵。但是当我通过一些像2x3或4x8这样的东西时 错误。我用了他们所有的例子。他们有不同的构造函数来执行此任务。我的第二个问题是,我是usded 3x3矩阵,它给出了

double[][] vals = {{1.,1.,0},{1.,0.,1.},{1.,3.,4.},{6.,4.,8.}};
  Matrix A = new Matrix(vals);
它产生了以下错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
之后,我想使用另一个构造函数,如下所示

double[][] vals = {{1.,1.,0,4},{1.,0.,1.,2},{1.,3.,4.,8},{1.,3.,4.,8}};
  Matrix A = new Matrix(vals,4,3);
它产生了以下产出:

A = 
 1.0 1.0 0.0
 1.0 0.0 1.0
 1.0 3.0 4.0
 6.0 4.0 8.0

A = U S V^T

U = 
 0.078 -0.115 -0.963
 0.107 -0.281 0.260
 0.402 0.886 -0.018
 0.906 -0.351 0.060

Sigma = 
 11.861881 0.000000 0.000000
 0.000000 2.028349 0.000000
 0.000000 0.000000 1.087006

V = 
 0.507705 -0.795196 -0.331510
 0.413798 0.562579 -0.715735
 0.755650 0.226204 0.614675

rank = 3
condition number = 10.912437186202627
2-norm = 11.86188091889931
singular values = 
 11.861881 2.028349 1.087006
它适用于非方矩阵。但它为svd生成了错误的结果,因为V和S没有相同的行=4(很抱歉,如果我不能正确分析结果,因为我是svd新手)。有什么想法吗? 我该怎么办?

请阅读。以下代码代表第2节中的示例

import Jama.Matrix; 
import Jama.SingularValueDecomposition; 

public class JAMATest { 

    static public void printMatrix(Matrix m){
        double[][] d = m.getArray();

        for(int row = 0; row < d.length; row++){
            for(int col = 0; col < d[row].length; col++){
                System.out.printf("%6.4f\t", m.get(row, col));
            }
            System.out.println();
        }
        System.out.println();
    }

    public static void main(String[] args) { 
        double[][] vals = { {1., 0., 0., 0., 2.}, 
                            {0., 0., 3., 0., 0.}, 
                            {0., 0., 0., 0., 0.}, 
                            {0., 4., 0., 0., 0.} 
                          };  
        Matrix A = new Matrix(vals);         
        SingularValueDecomposition svd = new SingularValueDecomposition(A); 

        System.out.println("A = ");
        printMatrix(A);

        System.out.println("U = ");
        printMatrix(svd.getU());

        System.out.println("Sigma = ");
        printMatrix(svd.getS());

        System.out.println("V = ");
        printMatrix(svd.getV());
    } 
} 
希望这有帮助。此外,FWIW这里是Matlab对同一问题的输出:

>> A = [1.0000,  0.0000,  0.0000,  0.0000,  2.0000; 0, 0, 3, 0, 0; 0, 0, 0, 0, 0; 0, 4, 0, 0, 0];
>> A

A =

     1     0     0     0     2
     0     0     3     0     0
     0     0     0     0     0
     0     4     0     0     0

>> [U, S, V] = svd(A);
>> U

U =

     0     0     1     0
     0     1     0     0
     0     0     0    -1
     1     0     0     0

>> S

S =

    4.0000         0         0         0         0
         0    3.0000         0         0         0
         0         0    2.2361         0         0
         0         0         0         0         0

>> V

V =

         0         0    0.4472         0   -0.8944
    1.0000         0         0         0         0
         0    1.0000         0         0         0
         0         0         0    1.0000         0
         0         0    0.8944         0    0.4472
关于第一个问题,以下代码不会产生错误:

import Jama.Matrix;

public class JAMATest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        double[][] vals = {{1.,1.,0},{1.,0.,1.},{1.,3.,4.},{6.,4.,8.}}; 
        Matrix A = new Matrix(vals); 

    }
}

因此,您正在执行的其他操作一定会导致它出现异常。尝试使用我的printMatrix方法代替您正在使用的任何方法,看看是否有帮助。

U、S和V的维度不需要与A的维度相同。U的行数相同,V^T的列数相同。根据矩阵乘法的规则,这就足以重新创建一个矩阵


其他维度(U列、V^T行和S行/列)将是A的“秩”(在示例3中)。粗略地说,这是数据的维度……需要多少个轴来唯一地表示a中的一列或一行。它最多为
min(rows,cols)
,但通常可以少得多。没关系。

这里要小心,JAMA主要支持满秩矩阵的SVD,如果您阅读“自述文件”,您会注意到对于秩不足(m 本质上,导致ArrayIndexOutOfBounds异常的原因是
SingularValueDecomposition
中的第486行:

return new Matrix(U,m,Math.min(m+1,n));
将此更改为:

return new Matrix(U);
这将解决问题。在封面下发生的最终情况(至少在vicatcu的例子中)是,您使用
m=4
n=5
注入一个矩阵,但请注意,在实际输出中
U
具有维度
m=4
n=4
。如果您阅读
SingularValueDecomposition
类的顶部,它会指出:

对于m>=n的m×n矩阵A,奇异值分解为 m×n正交矩阵U、n×n对角矩阵S和 一个n乘n的正交矩阵V,使得A=USV'


但这种情况并不成立,因为
m=4
n=5
意味着
mJama不支持完整的SVD,而只支持减少的SVD。它相当于MatlabSVD(B,0)或svd(B,'econ')。再见

对不起,我听不懂你的回答。你认为我在问题中写的输出是正确的吗?有多少V和S有3行?你能解释一下吗?很抱歉,我不是数学专家:(对我前面的程序进行了修改。我包括了printMatrix函数。请注意,我遇到了一个类似的异常,当我尝试使用m.getRowDimension()和m.getColumnDimension()时,因为它们对于svd.getU()方法似乎不准确。将矩阵转换为双精度[][]似乎就是这样。另一方面,矩阵的奇异值分解不是唯一的。请参阅维基百科文章中的这句话:“还应该注意,这种特殊的奇异值分解不是唯一的。”当你乘以U*S*V时,你会得到原始矩阵。矩阵的维数有点“连接”当你乘法时,我们的原始矩阵是[4x5]=[4x4]*[4x5]*[5x5],剩下的是外部的二维([4..x..5])。似乎你必须认识到,只有Sigma的前四行是基于这些属性的实际矩阵。@agazerboy,正如你从Matlab和Java输出中看到的,Matlab输出中U的第3列和第4列在符号上与Java输出不同——这是可以接受的,U构成正交正态基,因此任何列都可能是负的ted,这是可以接受的。你好。我得到了所有的NAN值,用单数S表示,以免单数U和右单数V。矩阵太大(146534378)。解决方案是什么?谢谢你的解决方案。我想用jama运行多元回归,但也有同样的问题。也许我的问题很奇怪,但我无法编辑SingularValueDecomposition类。这意味着netbeans不允许我编辑jama代码。
return new Matrix(U);
new Matrix(U, m, Math.min(m+1,n))