2012-09-28 44 views
3

我在scala微風中創建了一個稀疏矩陣,即使用http://www.scalanlp.org/api/breeze/linalg/CSCMatrix.html。現在我想從中獲得一個列切片。這個怎麼做?如何在scala微風中切割稀疏矩陣?

編輯:有一些進一步的要求:

  1. 這對我很重要,我其實可以做一些有用的東西與切片,如由浮動乘以:

    X(:: ,n)* 3.

  2. 對我而言,生成的結構/矩陣/向量保持稀疏也是很重要的。每列可能有數百萬的密集維度,但實際上只有600個條目左右。

  3. 我需要能夠使用此突變的基質中,例如:

    X(::,0)= X(::,1)

回答

3

切片的工作原理相同至於在Quickstart中討論的DenseMatrix。

val m1 = CSCMatrix((1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12), (13, 14, 15, 16)) 
val m2 = m1(1 to 2, 1 to 2) 
println(m2) 

此打印:

6 7 
10 11 
+0

有趣。你是對的。所以,如果我只想要一列,我可以做例如m1(0到2,0)。我不得不說,我認爲能夠做m1(::,0)會很好,但你已經回答了我的問題,所以我會將你的答覆標記爲答案。 –

+0

哎呀,我的意思是m1(0到2,0到0),這不完全像我想的那樣簡潔。 –

+0

嗯,等等,這有兩個問題(三個如果包括非簡潔的語法)。我不能乘以一個數字的切片,例如'm1(0到2,0到0)* 3.'不起作用。而切片的類型不再稀疏。 –

0

我到底寫我自己的切片機的方法。使用這樣的:

val col = root.MatrixHelper.colSlice(sparseMatrix, columnIndex) 

代碼:

// Copyright Hugh Perkins 2012 
// You can use this under the terms of the Apache Public License 2.0 
// http://www.apache.org/licenses/LICENSE-2.0 

package root 

import breeze.linalg._ 

object MatrixHelper { 
    def colSlice(A: CSCMatrix[Double], colIndex: Int) : SparseVector[Double] = { 
     val size = A.rows 
     val rowStartIndex = A.colPtrs(colIndex) 
     val rowEndIndex = A.colPtrs(colIndex + 1) - 1 
     val capacity = rowEndIndex - rowStartIndex + 1 
     val result = SparseVector.zeros[Double](size) 
     result.reserve(capacity) 
     var i = 0 
     while(i < capacity) { 
     val thisindex = rowStartIndex + i 
     val row = A.rowIndices(thisindex) 
     val value = A.data(thisindex) 
     result(row) = value 
     i += 1 
     } 
     result 
    } 
} 
+0

考慮它,這不實際上讓我改變矩陣,但它至少會產生一個稀疏向量,而不是一個密集向量,我可以乘以它等等。 –

+0

將此答案標記爲現在接受,因爲沒有人提供了更好的答案。 –

+0

對於downvoter,請發表評論解釋downvote。 –