2016-04-27 11 views
2

Chained Indizierung in ND4S und Breeze erzeugt einen Fehler Scala Compiler:Workaround für verkettete Indexierung Scala-Compiler-Fehler?

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

Die ersten beiden Arbeit, aber die dritte produziert:

not enough arguments for method apply: (implicit ev: org.nd4s.NDArrayEvidence[org.nd4j.linalg.api.ndarray.INDArray,B], implicit ev2: scala.reflect.Manifest[B])org.nd4j.linalg.api.ndarray.INDArray in class RichINDArray.

ich mit (0, 0) versuchte statt (0), da es immer noch 2d, aber das war nicht wichtig. Und viele Variationen von zusätzlichen Klammern.

Ist dies der Scala-Parser, der denkt, dass es ein anderes Konstrukt oder ein Fehler in ND4S ist? Gibt es eine Problemumgehungssyntax, die das Verketten ermöglichen kann?

EDIT:

Unter Breeze:

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

a und b Arbeit, aber c erzeugt diesen Compiler-Fehler:

type mismatch; found : Int(0) required: breeze.linalg.support.CanSlice2[breeze.linalg.DenseMatrix[Int],Int,collection.immutable.::.type,?]

Vielleicht als curried Funktionsaufrufe wird das Parsen, oder ein Makro expandiert in einer Weise, die hier nicht funktioniert. Und während ich rate, dass eine Person niemals eine Indexierung ketten muss, da m(0, 0) oben funktioniert und jede Indizierung zusammengebrochen werden kann, gibt es eine Lösung für den allgemeinen Fall, Scala in diesen Situationen zu tricksen?

Auch Verkettungs Arbeiten mit mehrdimensionalen Arrays:

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

Antwort

3

Beide Methoden m(0, ->) und m(0, ::) nehmen eine zweite implizite Parameterliste. Die Verkettung der Aufrufe wird daher von Scala als Versuch interpretiert, diese implizite Parameterliste explizit bereitzustellen. Aus diesem Grund werden die Argumentnummerkonflikte und die Argumenttypkonflikte gemeldet.

Versuchen Sie, (m(0, ->))(0) oder m(0, ->).apply(0) (oder das Breeze-Analog) zu verwenden. Dies zwingt Scala dazu, die implizite Parameterliste implizit bereitzustellen, und Ihr zweiter Aufruf wird dann zu einem normalen Funktionsaufruf, wie Sie es beabsichtigt hatten.