2011-04-28 91 views
0

我需要實現一個乘法公式,其中尺寸的行矩陣「n」是由一個N * N矩陣相乘的行向量..創建在Java矩陣工具包(MTJ)

我已經使用DenseMatrix類從2D數組創建n * n矩陣......但我的問題是如何創建一個行向量...

我可以使用CompRowMatrix類創建行矩陣...但爲此,輸入必須是'矩陣'..但矩陣是一個接口..不能實例化它.. CompRowMatrix class的第一個構造函數聲明它需要一個'非零數組索引'作爲輸入..但我無法理解什麼是這個非零指數數組?

還,我可以創造一個向量與 DenseVector或任何其他合適class..but似乎有沒有方法來直接乘以一個矩陣向量..

plz幫助

回答

3

CompRowMatrix類並非真正用作行向量,而是用於表示稀疏矩陣,以便可以輕鬆地逐行遍歷矩陣元素。

儘管可以將CompRowMatrix用作向量,但將第一個以外的所有行設置爲零,這對於程序員來說更復雜,而對於假定其他行可能會變得更加有效的代碼非零。

改爲使用DenseVector對象來保存行向量,並使用Matrix接口中的mult方法。它接受兩個Vector對象作爲參數並生成一個向量矩陣乘積。該方法被稱爲矩陣對象有下列參數相乘:

  • 月1日阿根廷,x,是要與你的矩陣
  • 2日阿根廷,y乘以向量,持有相乘的結果

所以以產生向量矩陣乘積y = x*A(其中兩個xy1 X n行向量和An X n矩陣),你會做這樣的事情:

// create matrix A 
double[][] matValues = new double[n][n]; 
... // initialize values of the matrix 
Matrix A = new DenseMatrix(matValues); 

// create vector x 
double[] vecValues = new double[n]; 
... // initialize values of the vector 
Vector x = new DenseVector(vecValues); 

// create vector y to store result of multiplication 
Vector y = new DenseVector(n); 

// perform multiplication 
A.mult(x, y); 

現在你可以在你的代碼的其餘部分使用y需要。在乘法之前分配y非常重要,但與它保存的數據無關。在退出時,mult方法將覆蓋y中的任何內容。

另請注意,我選擇初始化xA的方式不是唯一可用的方法。例如,上述代碼在構建對應的VectorMatrix對象時自動深度複製陣列vecValuesmatValues。如果您不打算將數組用於任何其他目的,那麼您可能不應執行此深層副本。您可以通過在構造函數中將額外的布爾參數設置爲false來完成此操作,例如

// create matrix A without deep copying matValues 
Matrix A = new DenseMatrix(matValues, false); 

你應該參考javadoc你和我之前鏈接到更多的構造函數選項。然而,請注意,javadoc的版本與當前版本的MTJ(版本1.01截至本文發佈時)不同。我不知道它是哪個版本,也不是我能夠找到當前版本的javadoc,但我確實發現了它與current source code之間的一些差異。

2

如果我沒有理解你的問題,一個解決方案是創建一個行和n列矩陣預乘nxn矩陣。有向量乘法的例程,但我相信它們都有向量乘以矩陣。如果您想使用這些例程,則必須進行適當的轉置。