【问题标题】:Breeze argmax on Vector: could not find implicit valueVector 上的微风 argmax:找不到隐式值
【发布时间】:2016-01-28 21:27:56
【问题描述】:

Scala 中的错误消息could not find implicit value 周围还有很多其他问题。答案非常具体,不适用于这个具体问题。

在 Scala Breeze 中,我尝试将 argmax 应用于 SparseVector[Int]。根据文档(和直觉),这很容易与

argmax(SparseVector.zeros[Int](5))

导入breeze.linalg._后。

我的实际测试代码如下所示:

import breeze.linalg.{Vector, argmax, sum}

val counts: Map[Int, Vector[Int]] = ...
counts
  .filter(e => sum(e._2) > 10)
  .take(100)
  .map(e => (e._1, argmax(e._2)))
  .foreach(println)

但是,编译器会抛出以下错误消息:

Error:(41, 37) could not find implicit value for parameter impl: breeze.linalg.argmax.Impl[breeze.linalg.Vector[Int],VR]
.map(e => (e._1, argmax(e._2)))
                       ^

一些或多或少令人惊讶的观察结果:

  • sum(e._2) 似乎编译得很好。
  • 在内部使用 DenseVector 而不是 SparseVector 不会改变任何内容

我该如何解决这个问题或至少缩小根本原因。

【问题讨论】:

    标签: scala scala-breeze


    【解决方案1】:

    我通过将类型明确声明为SparseVector 而不是Vector 解决了这个问题:

    val counts: Map[Int, SparseVector[Int]] = ...
    

    据我了解,这个解决方案远非显而易见,我仍然不清楚为什么 argmax() 似乎无法处理更通用的 Vector 类,但它确实有效。

    【讨论】:

    • 我发现微风的代码很难导航,但我认为错误信息很清楚。 argmax 无法找到 Vector 类型所需的一些隐含信息。简单看一下 argmax 的实现,它似乎需要一个隐式类型的 CanTraverseKeyValuePairs,对于类型 Sparse/Dense Vector 很容易找到,但没有 Vector 的实现。
    • 如果你已经完全掌握了implicits的用法(在Breeze中),这可能是正确的。
    • 老实说,这是使用类型类时的普遍问题
    • 我觉得这就是我的答案,但请在 github 上开一张票。一般来说,我没有像使用 DenseVector 和 SparseVector 那样努力确保 Vector 的一切正常工作。 @melps 我同意代码有时很难遵循。让我知道是否有什么特别需要改进的地方
    • 好的,这应该在主/我现在发布的快照中修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 2017-02-02
    • 2016-02-23
    • 1970-01-01
    • 2011-10-17
    • 2016-03-31
    相关资源
    最近更新 更多