簡體   English   中英

Scala錯誤無法找到參數的隱式值

[英]Scala error Could not find implicit value for parameter

我有函數flagVectorOutlier如下面的代碼所示。 我正在使用Breeze的DenseVectorDenseMatrix對象來計算distance的值。 我期望在函數簽名上編碼,以獲得Spark RDD[(Double, Boolean)] miinvCovMatrix分別是Breeze的DenseVector[Double]DenseMatrix[Double]

  def flagVectorOutlier(testVectors: RDD[(String, SparkVector)], distanceThreshold: Double): RDD[(Double, Boolean)] = {
    val testVectorsDenseRDD = testVectors.map { vector => DenseVector(vector._2.toArray)}
    val mahalanobisDistancesRDD = testVectorsDenseRDD.map { vector =>
      val distance = DenseVector[Double](DenseVector(Transpose(vector - mi) * invCovMatrix) * DenseVector(vector - mi)).toArray
      (distance(0), if(distance(0) >= distanceThreshold) true else false)
    }

    mahalanobisDistancesRDD
  }

編譯器最終向我顯示以下2個錯誤:

Error:(75, 93) could not find implicit value for parameter op: breeze.linalg.operators.OpMulMatrix.Impl2[breeze.linalg.DenseVector[breeze.linalg.Transpose[breeze.linalg.DenseVector[Double]]],breeze.linalg.DenseVector[breeze.linalg.DenseVector[Double]],That]
      val distance = DenseVector[Double](DenseVector(Transpose(vector - mi) * invCovMatrix) * DenseVector(vector - mi)).toArray
                                                                                            ^

Error:(75, 93) not enough arguments for method *: (implicit op: breeze.linalg.operators.OpMulMatrix.Impl2[breeze.linalg.DenseVector[breeze.linalg.Transpose[breeze.linalg.DenseVector[Double]]],breeze.linalg.DenseVector[breeze.linalg.DenseVector[Double]],That])That.
Unspecified value parameter op.
      val distance = DenseVector[Double](DenseVector(Transpose(vector - mi) * invCovMatrix) * DenseVector(vector - mi)).toArray
                                                                                            ^

我錯過了什么? 我正在考慮以這種方式在Breeze的DenseVector之間進行相乘。

如果仔細查看錯誤消息,它會告訴您出了什么問題。

(implicit op: OpMulMatrix.Impl2[
       DenseVector[Transpose[DenseVector[Double]]],
       DenseVector[DenseVector[Double]],
       That])

繁殖的操作數幾乎肯定不是你想要的。 LHS是一個DenseVector,其元素是Transpose'denseVectors。 RHS是DenseVector[DenseVector[Double]] 您的外部DenseVector(..)調用將其參數包裝在新的DenseVectors中,而不是將參數轉換為DenseVector。

我相信這就是你想要的:

val diff = (vector - mi).toDenseVector
(diff.t * invCovMatrix * diff)

Breeze在很大程度上依賴於implicits(如果您不熟悉它們,請閱讀這些內容)以確定不同操作的兼容類型。 顯然,您調用的運算符需要這樣的隱式參數,並且編譯器無法在范圍內找到一個。 所以有兩種選擇:

  1. 您缺少導入,該導入將生成缺少該方法的隱式參數。

  2. 您正在嘗試將不兼容的類型相乘,並且不存在正確的隱式參數。 例如, 本教程提到以下內容:

具有不兼容基數或更大數字類型的分配將無法編譯。

scala> m:= x:13:錯誤:找不到參數op的隱式值:breeze.linalg.operators.BinaryUpdateOp [breeze.linalg.DenseMatrix [Int],bre​​eze.linalg.DenseVector [Double],bre​​eze.linalg。 operators.OpSet] m:= x ^

一方面很高興讓編譯器能夠選擇這種兼容性錯誤,但遺憾的是你得到的錯誤並不是很有說服力。

你應該明確地聲明類型如下,重點關注變量ab

package com.tencent.ieg.dm.demo
import breeze.linalg.{Vector, DenseVector, SparseVector}

object BreezeDemo extends App {

    val a:Vector[Long] = DenseVector(2, 10, 3)
    // val a = DenseVector(2, 10, 3) // cause compiling error
    val b:Vector[Long] = new SparseVector(Array(0),Array(2),3)
    val rst = a dot b
    println(rst)

}

我也遇到了這個問題,Breeze給了我同樣的錯誤信息。 在我的情況下,我的X類型是DenseVector [Double],而Y類型是DenseVector [Int],在我將Y類型更改為DenseVector [Double]后,此錯誤消失。 希望這可以幫到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM