2014-01-23 43 views
0

我正在使用parallel colt其中我需要找到矩陣的排名。 API文檔說以下有關以下有關DoubleAlgebra#rank矩陣秩不按照API規範並行工作小馬

秩(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對象。任何想法爲什麼運行時異常發生?

+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

很難記錄每一項要求。如果我的回答有幫助,我會感激upvote/accept。你的問題似乎很奇怪,例如「爲什麼這個文檔錯了?」這是不可能的,除非你是作者:) – ashes999