如何在scala微风中切割稀疏矩阵?

时间:2012-09-28 09:02:24

标签: scala linear-algebra sparse-matrix

我在scala微风中创建一个稀疏矩阵,即使用http://www.scalanlp.org/api/breeze/linalg/CSCMatrix.html。现在我想从中获取一个列切片。怎么做?

编辑:还有一些要求:

  1. 对我来说很重要的是我可以用切片做一些有用的事情,例如将它乘以浮点数:

    X(::,n)* 3.

  2. 对我来说,由此产​​生的结构/矩阵/向量仍然稀疏也很重要。每列可能具有数百万的密集维度,但实际上只有600个条目左右。

  3. 我需要能够使用它来改变矩阵,例如:

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

2 个答案:

答案 0 :(得分: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  

答案 1 :(得分: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
   }
}