3

http://www.scalanlp.org/api/breeze/linalg/CSCMatrix.htmlを使用して、スカラ風でスパース行列を作成します。今、そこから列スライスを取得したいと考えています。これを行う方法?

編集:さらにいくつかの要件があります:

  1. 私にとって重要なことは、実際にスライスを使って便利なことをできることです。たとえば、フロートで乗算します。

    X(::,n) * 3.

  2. 結果の構造/行列/ベクトルがまばらなままであることも私にとって重要です。各列には数百万の密なディメンションがある場合がありますが、実際には 600 程度のエントリしかありません。

  3. これを使用してマトリックスを変更できるようにする必要があります。たとえば、次のようになります。

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

4

2 に答える 2

3

スライスは、クイックスタートで説明されている 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  
于 2012-09-28T14:25:21.390 に答える
1

最後に独自のスライサー メソッドを作成しました。次のように使用します。

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
   }
}
于 2012-09-29T14:36:23.207 に答える