假设我们有矩阵,它有基础列和非基础列。并且我们需要能够获得矩阵或非基础的基础部分。
哪些列是在声明为var base: Array[Boolean]
目前我这样做:
def getMatrix(matrix: DenseMatrix[Double], pred: Boolean, m: Int, n: Int): DenseMatrix[Double] = {
var a = DenseMatrix.zeros[Double](m, n)
var scanPos: Int = 0
var insertPos: Int = 0
for (el <- base) {
if (el == pred) {
a(::, insertPos) := matrix(::, scanPos)
insertPos += 1
}
scanPos += 1
}
return a
}
但这段代码很难看,我真的讨厌它。必须有一个更优雅的解决方案,我要求它
PS:来自breeze库的DenseMatrix类,可以认为是二维数组
答案 0 :(得分:0)
我不确定微风是否提供了更好的方法,但你可以这样做:
def getMatrix(matrix: DenseMatrix[Double], pred: Boolean, m: Int, n: Int): DenseMatrix[Double] = {
val data = base
.zipWithIndex
.filter(_._1 == pred)
.map(b => matrix(::, b._2).toArray)
.flatten
new DenseMatrix(m, n, data)
}
这样的事也应该有效:
def getMatrix(matrix: DenseMatrix[Double], pred: Boolean, m: Int, n: Int): DenseMatrix[Double] = {
val a = DenseMatrix.zeros[Double](m, n)
for {
x <- base.zipWithIndex.filter(_._1 == pred).zipWithIndex
((el, matrixIndex), newIndex) = x
} yield a(::, newIndex) := matrix(::, matrixIndex)
a
}