【问题标题】:Workaround for chained indexing Scala compiler error?链式索引 Scala 编译器错误的解决方法?
【发布时间】:2016-08-22 01:00:58
【问题描述】:

ND4S 和 Breeze 中的链式索引会产生 Scala 编译器错误:

var m = Nd4j.create(2, 3)
var a = m(0, ->)
var b = a(0)
var c = m(0, ->)(0)

前两个有效,但第三个产生:

方法 apply 的参数不足:(隐式 ev:org.nd4s.NDArrayEvidence[org.nd4j.linalg.api.ndarray.INDArray,B],隐式 ev2:scala.reflect.Manifest[B])org.nd4j RichINDArray 类中的 .linalg.api.ndarray.INDArray。

我尝试使用 (0, 0) 而不是 (0),因为它仍然是 2d,但这没关系。还有许多额外括号的变体。

这是 Scala 解析器认为它是其他构造还是 ND4S 中的错误?是否有一些解决方法可以使链接起作用?

编辑:

微风中:

var m = DenseMatrix.zeros[Int](5,5)
var a = m(0, ::)
var b = a(0)
var c = m(0, ::)(0)

a 和 b 工作,但 c 产生此编译器错误:

类型不匹配;发现:需要 Int(0):breeze.linalg.support.CanSlice2[breeze.linalg.DenseMatrix[Int],Int,collection.immutable.::.type,?]

也许这被解析为 curried 函数调用,或者宏以一种在这里不起作用的方式展开。虽然我猜一个人永远不需要链接索引,因为m(0, 0) 在上面工作并且任何索引都可以折叠,对于在这些情况下欺骗 Scala 的一般情况有一些解决方案吗?

此外,链接也适用于多维数组:

var n = Array.ofDim[Double](2, 3)
var x = n(0)(0)

【问题讨论】:

    标签: scala scala-breeze nd4j


    【解决方案1】:

    m(0, ->)m(0, ::) 两种方法都采用第二个隐式参数列表。因此,Scala 将链接调用解释为试图显式提供此隐式参数列表。这就是它报告参数编号不匹配和参数类型不匹配的原因。

    尝试使用(m(0, ->))(0)m(0, ->).apply(0)(或Breeze 类似物)。这会强制 Scala 隐式提供隐式参数列表,然后您的第二次调用就会变成您想要的正常函数调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      相关资源
      最近更新 更多