我在scala-breeze中创建了一个稀疏矩阵,即使用http://www.scalanlp.org/api/breeze/linalg/CSCMatrix.html.现在我想从中获取一个列切片。如何做到这一点?
编辑:还有一些进一步的要求:
-
对我来说,重要的是我可以对切片做一些有用的事情,例如将其乘以浮点:
X(:,n)*3。
-
对我来说,得到的结构/矩阵/向量保持稀疏也是很重要的。每一列可能有几百万的密集维度,但实际上只有600个左右的条目
-
我需要能够使用这个来变异矩阵,例如:
X(:,0)=X(::,1)
切片的工作原理与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
我最终编写了自己的切片器方法。像这样使用:
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
}
}