Матричный ранг не работает в соответствии со спецификациями API в параллельном кольте

Я использую параллельный жеребенок, в котором мне нужно найти ранг матрицы. Документация 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 объект. Любая идея, почему происходит исключение во время выполнения?

1 ответ

Решение

Кажется, что, как говорится в сообщении, это действительно нужно 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 вместо того, что вы сейчас отправляете.

Другие вопросы по тегам