2014-01-23 3 views
0

Я использую parallel colt, где мне нужно найти ранг матрицы. Документация API говорит следующее о следующем о DoubleAlgebra#rank:Матричный ранг не работает согласно спецификациям API в параллельном colt

ранга (DoubleMatrix2D 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 */ } 

BottomLine, везде я вижу требование для DoubleMatrix2D объекта, а не a DenseDoubleMatrix2D объект. Любая идея, почему происходит исключение во время выполнения?

+0

Можете ли вы показать нам что-нибудь о матрице, которую вы пытаетесь вычислить ранг? На что это похоже? Что это за экземпляр класса? – ashes999

+0

Как бы вы выполнили [Различия в единичном значении] (http://en.wikipedia.org/wiki/Singular_value_decomposition) с разреженной матрицей? –

ответ

0

Похоже, как говорится в сообщении, это действительно делает нужен пример 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"); 
} 

Вы можете увидеть фактический код исключения here.

То, что вы, вероятно, хотите сделать, это просто использовать экземпляр DenseDoubleMatrix2D вместо того, чтобы все, что вы в данный момент отправки в.

+0

Да, так мне удалось заставить работать мой код. Фактически, я оказался на той же странице grepcode, с которой вы связались. Но поскольку API требует только аргумента DoubleMatrix2D, не следует, чтобы исходный код возвращал значение «checkDense» логически, а метод «rank» имел что-то вроде 'if (checkDense (A) == false) A = new DenseDoubleMatrix2D (A .toArray()) '? Я предполагаю, что меня больше раздражает недокументированная разница между API и фактическим поведением кода, чем что-либо еще. –

+0

Трудно документировать каждое требование. Если бы мой ответ помог, я был бы признателен за продвижение/принятие. Однако ваш вопрос казался странным, что-то вроде «почему эта документация не так?» что невозможно сказать, если вы не автор :) – ashes999

Смежные вопросы