java jama矩阵问题

use*_*384 4 java math matrix jama

我正在使用jama来计算 SVD。效果非常好。如果我通过方阵。例如 2x2 或 3x3 等矩阵。但是当我传递像 2x3 或 4x8 这样的东西时,它会给出错误。我使用了他们所有的例子。他们有不同的构造函数来执行这项工作。我的第二个问题是,我使用 3x3 矩阵,它给出了

double[][] vals = {{1.,1.,0},{1.,0.,1.},{1.,3.,4.},{6.,4.,8.}};
  Matrix A = new Matrix(vals);
Run Code Online (Sandbox Code Playgroud)

它产生了以下错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
Run Code Online (Sandbox Code Playgroud)

之后我想使用另一个构造函数,如下所示

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);
Run Code Online (Sandbox Code Playgroud)

它产生以下输出:

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
Run Code Online (Sandbox Code Playgroud)

它适用于非方阵。但它为 svd 产生了错误的结果,因为 V 和 S 没有相同的 rows=4 (如果我无法正确分析结果,我很抱歉,因为我是 SVD 的新手)。任何想法?我应该怎么办?

Mar*_*iot 5

这里要小心,JAMA 主要支持满秩矩阵的 SVD,如果您阅读“自述文件”,您会注意到该行为对于秩不足 (m < n) 矩阵不一定正确。

本质上,导致 ArrayIndexOutOfBounds 异常的原因是以下代码中的第 486 行SingularValueDecomposition:

return new Matrix(U,m,Math.min(m+1,n));
Run Code Online (Sandbox Code Playgroud)

将其更改为:

return new Matrix(U);
Run Code Online (Sandbox Code Playgroud)

将解决问题。最终在幕后发生的事情(至少对于 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 = U S V'。

但这在这种情况下并不成立,因为m=4和n=5意味着m<n。现在,由于您传递的秩不足矩阵 U 的维度与SVD 类的正常调用情况不同,因此语句:

new Matrix(U, m, Math.min(m+1,n))
Run Code Online (Sandbox Code Playgroud)

将创建一个矩阵,其中假定的行数为m,此处为 4 (这是正确的),假定的列数为n,此处为Math.min(4+1,5)=5(这是不正确的)。因此:当您打印矩阵并且打印例程调用 时getColumnDimension,U 矩阵返回5,它大于实际的后备数组维度。

简而言之,切换到我上面粘贴的行将检测 U 的维度,因此无论排名如何都会返回有效结果。