Breeze使用向量分解来改变DenseMatrix

时间:2015-03-25 22:52:28

标签: scala scala-breeze

下面的代码生成0-1矩阵,更改每个奇数行并组成一个新矩阵。我想使用foldLeft连接向量但我得到Not all matrices have the same number of columns,可能是因为foldLeft的零(或单位)元素是未知大小的空向量。

import breeze.linalg._
import breeze.stats.distributions._
object ZeroOneMatrix {
  def main(args: Array[String]) {
    val n = 4
    val m = DenseMatrix.rand[Int](n, n, rand = Rand.randInt(2))
    println(m)

    // vs is of type Vector[DenseVector[Int]]
    val vs = for (r <- 0 until n)
      yield {
        if (r % 2 == 1)
          m(r, ::).t map (e => (e + 1) % 2)
        else m(r, ::).t
      }
    println(vs)

    // compose matrix back from the list of vectors vs
    val f = (vs foldLeft DenseVector[Int]().asDenseMatrix)(
        (mat, v) => DenseMatrix.vertcat(v.asDenseMatrix, mat))
    println(f)
  }
}

怎么能修好?另外,为什么map无法在没有转发的情况下调用m(r, ::)?理想情况下,我会将选定的矢量映射到新的矢量,然后使用DenseMatrix.horzcat来构建矩阵。

在整个矩阵上不使用map函数的原因是某些行不会被更改。

1 个答案:

答案 0 :(得分:0)

你是对的,为什么它不起作用。为什么不使用reduce?或者:DenseVector.vertcat(vs:_*)

Map:Breeze特权列向量,行向量缺少许多功能。一般来说,你应该养成使用列而不是行的习惯。