2016-04-27 74 views
2

在ND4S微風鏈式索引產生Scala編譯器錯誤:鏈接索引的變通方法Scala編譯器錯誤?

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

前兩個工作,但第三個生產:

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.

(0, 0),而不是(0)因爲它仍然是2D嘗試,但那並不重要。和額外括號的許多變化。

難道這斯卡拉解析器認爲它是其他一些結構或ND4S錯誤?是否有一些可以使鏈接工作的解決方法?

編輯:

在微風:

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

a和b的工作但是C產生此編譯器錯誤:

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

也許這是解析作爲咖喱函數調用,或宏以在這裏不起作用的方式擴展。雖然我猜一個人從來不需要鏈接索引,因爲m(0, 0)工作在上面,任何索引都可以摺疊,對於在這些情況下欺騙S​​cala的一般情況,是否有一些解決方案?

此外,多維數組鏈接的作品:

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

回答

3

這兩種方法m(0, ->)m(0, ::)採取第二個隱含參數列表。因此,鏈接調用被Scala解釋爲試圖顯式提供這個隱式參數列表。這就是爲什麼它報告參數號碼不匹配和參數類型不匹配。

嘗試使用(m(0, ->))(0)m(0, ->).apply(0)(或微風類似物)。這迫使Scala隱式提供隱式參數列表,然後您的第二個調用將成爲您想要的普通函數調用。