【问题标题】:Scala Breeze (a library for numerical processing); How to convert a DenseMatrix of Int's to a DenseMatrix of Doubles?Scala Breeze(数值处理库);如何将 Int 的 DenseMatrix 转换为 Doubles 的 DenseMatrix?
【发布时间】:2014-02-12 13:23:56
【问题描述】:

使用Scala Breeze library

如何将 breeze.linalg.DenseMatrixInt 值的实例转换为 DenseMatrixDoubles(两个矩阵具有相同的维度)?

(我正在尝试在矩阵中获取图像/图片以使用 Breeze 进行图像处理)

【问题讨论】:

    标签: scala image-processing scala-breeze


    【解决方案1】:

    fotNelton 的回答有效。另一种选择是:

    dm.mapValues(_.toInt)
    

    dm.values.map(_.toInt)
    

    从 Breeze 0.6 开始,您还可以说:

    convert(dm, Int)
    

    【讨论】:

    • 不错。这让我很好奇:对于大型矩阵,我的解决方案显然很慢,因为每个元素都调用了dm(_,_)breeze.generic.CanMapValues的对应实例我没有详细看,但是假设它更快是否正确?
    • Hrm,我认为它很可能不会更快。如果专业化完美地完成了它的工作,它可能会避免所有的拳击。我有一段时间没看字节码了。 (Specialized 很少能完美地完成工作。)
    • 除了专业化之外,我认为从DenseMatrixDenseMatrixCanMapValues 的实例可能不需要通过以下方式访问原始矩阵的元素通过apply 等索引每个元素。所以它可以节省无数次调用,只需从一个底层数组映射到另一个。
    • 呵呵,我刚刚意识到访问底层数组仍然依赖于专业化。嗯……
    • 是的。所以,这就是我实现 [@]expand 宏的原因。它尝试做的比[@]specialized 少得多,也就是说,expand 不会尝试使专门化的类继承自非专门化的类;它只是命名修饰和代码生成。因此,我应该能够为 CanMapValues 切换到 @expand,这意味着至少可以保证对数组的访问是正确的。如果专业化搞砸了,Function1 可能会引入装箱的问题仍然存在,但如果不实现更多宏,我们只能做这么多。
    【解决方案2】:

    您可以为此使用DenseMatrix.tabulate

    scala> val dm = DenseMatrix((1.0, 2.0), (3.0, 4.0))
    dm: breeze.linalg.DenseMatrix[Double] =
    1.0  2.0
    3.0  4.0
    
    scala> val im = DenseMatrix.tabulate(dm.rows, dm.cols)(dm(_,_).toInt)
    im: breeze.linalg.DenseMatrix[Int] =
    1  2
    3  4
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-18
      • 2018-06-20
      • 1970-01-01
      • 1970-01-01
      • 2014-06-05
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多