我正在使用并行柯尔特,其中我需要找到矩阵的等级。API文档对DoubleAlgebra#rank
:
等级(doublematrix2d a)
返回从单数值分解获得的矩阵A的有效数字等级。
但是,当我在代码中使用它时,我在运行时会得到一个IllegalargumentException:
Exception in thread "main" java.lang.IllegalArgumentException: Matrix must be dense
at cern.colt.matrix.tdouble.algo.DoubleProperty.checkDense(Unknown Source)
at cern.colt.matrix.tdouble.algo.decomposition.DenseDoubleSingularValueDecomposition.<init>(Unknown Source)
at cern.colt.matrix.tdouble.algo.DenseDoubleAlgebra.svd(Unknown Source)
at cern.colt.matrix.tdouble.algo.DenseDoubleAlgebra.rank(Unknown Source)
API不提到矩阵需要致密。在我的IDE(我使用Intellij Idea)中,当我ctrl 单击我的代码中的方法名称时,它转到源,显示
public int rank(cern.colt.matrix.tdouble.DoubleMatrix2D doubleMatrix2D) { /* compiled code */ }
底线,到处都看到DoubleMatrix2D
对象的需求,而不是DenseDoubleMatrix2D
对象。知道为什么运行时异常会发生?
,正如消息所说的那样,它确实需要DenseDoubleMatrix2D
实例。
这是源的轨迹(用A
简化的整个名称):
DoubleAlgebra.rank(DoubleMatrix2D A): return svd(A).rank();
> svd(DoubleMatrix2D A): return new DenseDoubleSingularValueDecomposition(A, true, true);
> DenseDoubleSingularValueDecomposition(): checkDense(A);
checkDense
本身:
public void checkDense(DoubleMatrix2D A) {
if (!(A instanceof DenseDoubleMatrix2D) && !(A instanceof DenseColumnDoubleMatrix2D))
throw new IllegalArgumentException("Matrix must be dense");
}
您可以在此处看到实际的异常代码。
您可能想做的就是使用DenseDoubleMatrix2D
的实例,而不是您当前发送的任何内容。