2016-06-13 8 views
0

Я пытаюсь создать общую функцию repVec, аналогичную функции Matlab repmat с использованием Scala Breeze.Scala Abstract Typing with Tabulate

Сначала я попробовал:

def repVec[T](in: DenseVector[T], nRow: Int): DenseMatrix[T] = 
{ 
    DenseMatrix.tabulate[T](nRow, in.size){case (_, j) => in(j)} 
} 

, но это дало мне ошибку:

Error:(112, 41) No ClassTag available for T 
     DenseMatrix.tabulate[T](nRow, in.size){case (_, j) => in(j)} 
              ^
Error:(112, 41) not enough arguments for method tabulate: (implicit evidence$15: scala.reflect.ClassTag[T], implicit evidence$16: breeze.storage.Zero[T])breeze.linalg.DenseMatrix[T]. 
Unspecified value parameters evidence$15, evidence$16. 
     DenseMatrix.tabulate[T](nRow, in.size){case (_, j) => in(j)} 
             ^

После выполнения некоторого чтения, particularily here, я попробовал, добавив неявный TypeTag вот так:

def repVec[T](in: DenseVector[T], nRow: Int)(implicit tag: TypeTag[T]): DenseMatrix[T] = 
{ 
    DenseMatrix.tabulate[T](nRow, in.size){case (_, j) => in(j)} 
} 

Но у меня такая же ошибка.

Любые мысли о том, что происходит? Как мое использование отличается от этого примера (из ссылки), которое я могу построить просто отлично?

def gratuitousIntermediateMethod[T](list:List[T])(implicit tag :TypeTag[T]) = 
    getInnerType(list) 

def getInnerType[T](list:List[T])(implicit tag:TypeTag[T]) = tag.tpe.toString 

Edit:

Необходимое ClassTag и Zero, здесь полное решение:

def repVec[T:ClassTag:Zero](in: DenseVector[T], nRow: Int): DenseMatrix[T] = 
{ 
    DenseMatrix.tabulate[T](nRow, in.size)({case (_, j) => in(j)}) 
} 

ответ

1

Вам нужно добавить неявную ClassTag, а не TypeTag. Они не связаны между собой (несколько разочаровывает).

+0

Хм, вы меняете неявный бит на '(неявный тег: ClassTag [T]):'? –

+0

Хорошо, я добавил «ClassTag», как [so] (http://pastebin.com/jhuvuhFf). Я получаю ошибку: 'не удалось найти неявное значение для параметра доказательства типа breeze.storage.Zero [T]'. Это потому, что 'DenseMatrix' ограничивается числовыми типами, такими как' Double', 'Int' и т. Д.? Я заметил это: '@spec (Double, Int, Float, Long) V' в определении' DenseMatrix', мне нужно сделать что-то подобное? –

+0

Nevermind, получил его, необходимо 'repVec [T: ClassTag: Zero]' –