3

我在 Scala 微风中创建了一个稀疏矩阵,即使用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 相同,这在Quickstart中进行了讨论。

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 回答