【问题标题】:How to slice a sparse matrix in scala breeze?如何在 scala 微风中切片稀疏矩阵?
【发布时间】:2012-09-29 22:36:23
【问题描述】:

我在 Scala 微风中创建了一个稀疏矩阵,即使用http://www.scalanlp.org/api/breeze/linalg/CSCMatrix.html。现在我想从中得到一个列切片。如何做到这一点?

编辑:还有一些进一步的要求:

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

    X(::,n) * 3.

  2. 对我来说,生成的结构/矩阵/向量保持稀疏也很重要。每列可能有几百万的密集维度,但实际上只有 600 个左右的条目。

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

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

【问题讨论】:

    标签: scala linear-algebra sparse-matrix


    【解决方案1】:

    切片的工作原理与 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  
    

    【讨论】:

    • 有趣。你是对的。因此,如果我只想要一列,例如 m1(0 to 2, 0)。我不得不说我觉得能够做 m1(::,0) 会很好,但是你已经回答了我的问题,所以我会将你的回复标记为答案。
    • 哎呀,我的意思是 m1(0 到 2, 0 到 0),这并不像我想要的那样简洁。
    • 嗯,等等,这有两个问题(三个如果包含不简洁的语法)。我不能将切片乘以一个数字,例如m1(0 to 2, 0 to 0 ) * 3. 不起作用。并且切片的类型不再稀疏。
    • 还有一个问题:我不能用它来改变矩阵,例如我不能做 m1(0 to 2, 0 to 0) = m1(0 to 2,1 to 1)跨度>
    【解决方案2】:

    最后我编写了自己的切片器方法。像这样使用:

    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
       }
    }
    

    【讨论】:

    • 想一想,这实际上并不能让我对矩阵进行变异,但它至少会产生一个稀疏向量,而不是一个密集向量,而且我可以将它相乘等等。跨度>
    • 暂时将此答案标记为已接受,因为没有人提供更好的答案。
    • 对于投反对票的人,请留下评论来解释投反对票。
    猜你喜欢
    • 2011-11-28
    • 2021-04-10
    • 2019-02-12
    • 2019-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    相关资源
    最近更新 更多