2

私は現在、機械学習のためのガウス過程を含むプロジェクトに取り組んでいます。の例と説明を考慮して、トレーニングされたGPオブジェクトの一部であるさまざまなパラメーターのジェネリック関数を作成しようとしています-したがって、次の宣言は(単純な)トレーニング関数の最も一般的な宣言です。

def train[T, M <: MatrixInverter[T], S <: Kernel[T]](): GP_Spawn[T] = null

(疑問に思っている場合は、パラメーターリストと実装を削除しました。) T数値タイプについて説明します。たとえば、DoubleまたはIntMatrixInverter[T]関数を強制する特性ですcalculateInverseKernel[T]カーネル関数に対応する特性です。すでにご存知の方もいらっしゃると思いますが、コレスキー分解を行列インバーターとして使用すると、ガウス過程のトレーニングを変更(いくらか簡略化)できるため、上記の関数を特殊化することを検討しました。タグのドキュメントにより、次の@specializedようになります。

def train[T, @specialized(CholeskyDecomposition[T]) M <: MatrixInverter[T], S <: Kernel[T]](): GP_Spawn[T] 

に依存するいくつかの変数(タイプ、、、 )をT使用する必要があるため、すべてのパラメーターが多かれ少なかれに依存していることは明らかです。上記のコードをコンパイルしようとすると、scala-compiler(2.9.2)は次のように文句を言います。TVector[T]Matrix[T]

エラー:見つかりません:値CholeskyDecomposition

import algorithms.{CholeskyDecomposition, MatrixInverter}インポートが正しいので、これが何を意味するのかわかりません。さらに、のインポートが未使用のインポートステートメントCholeskyDecompositionとしてマークされているのを見るのは不思議です。アルゴリズム自体に関連するいくつかの定数を含むコンパニオンがありますが、この側面がこのエラーの理由であるとは思いません。CholeskyDecomposition

このエラーの原因となる可能性のあるアイデアはありますか?そして、さらに、一般的なアプローチをカットせずにそれを解決する方法は?

編集:

答えを読んだ後、コードの並べ替えを検討していると、実行時に型照合を使用するソリューションになりました。

val testMat = new Matrix[T](3, 3)
val testInv = fac(testMat)    
testInv match {
    case chol : CholeskyDecomposition[T] => println("Found Cholesky!")
    case _ => println("Found something different.")
}

そしてそれは今動作します:)すべてに感謝します!

4

3 に答える 3

5

Intプリミティブ型: 、などのジェネリックパラメータのみを特殊化できDoubleます。したがって、がプリミティブであっても、特殊化することはできますが、特殊化することはできTません。Foo[T]T

于 2012-11-22T11:25:45.350 に答える
3

Cタイプに特化したクラスがある場合はT

class D[@specialized T, C[T]](c: C[T]) { ... }

Tの-specializedversonを使用しCます。

とにかく必要なのはこれだけです。オブジェクトに特化する意味はありません。とにかくプリミティブでないものはすべてオブジェクトであるため、ジェネリックコードも同様に機能します。

于 2012-11-22T13:54:22.600 に答える
1

APIによると、次のように表示されます。

Type T can be specialized on a subset of the primitive types by
specifying a list of primitive types to specialize at:

したがって、基本的にはプリミティブ型のみです。

于 2012-11-22T11:28:14.150 に答える