DiffFunction内部的Cant访问矩阵行

时间:2020-07-30 03:31:55

标签: scala scala-breeze

我正在尝试运行此简单程序:

object Test {
  
  def foo(args: (Double, Double, Double)*) = {
    val x = DenseMatrix(args.toList :_*)
    val r = DenseVector(5.0, 5.0, 0.0)
    println(sum(x(*, ::) - r)) // works
    val func = new DiffFunction[DenseVector[Double]] {
      def calculate(r: DenseVector[Double]) = {
        sum(x(*, ::) - r) // Doesn't work
      }
    }
  }

  def main(args: Array[String]) {
    foo((0.0, 0.0, 0.0), (5.0, 5.0, 0.0), (10.0, 0.0, 0.0))
  }
}

但是出现以下错误:

Missing arguments for method *(B)(OpMulMatrix.Impl2[TT, B, That])
Missing arguments for method *(B)(OpMulMatrix.Impl2[TT, B, That])
Cannot resolve symbol *

似乎我不能使用运算符*来引用DiffFunction内部矩阵的每一行。

为什么在DiffFunction外部使用运算符*访问矩阵行并从中减去向量有效,但在DiffFunction内部却行不通?

1 个答案:

答案 0 :(得分:0)

所以,这很不幸,我之前从未见过。这是因为DiffFunction实际上实现了ImmutableNumericOps,这意味着它具有所有各种运算符(包括def *)作为成员。这意味着当在DiffFunction的类主体中看到*时,它将解析为该方法,而不是名为*的对象。

要解决此问题,您必须说sum(x(breeze.linalg.*, ::) - r)