在
后面<foo>.t(..) // .t() is transpose
这是我正在寻找的一个可能的例子:在Transpose对象中有以下低级代码(“点”):
implicit def transTimesNormalFromDot[T, U, R](implicit dot: OpMulInner.Impl2[T, U, R]): OpMulMatrix.Impl2[Transpose[T], U, R] = {
new OpMulMatrix.Impl2[Transpose[T], U, R] {
def apply(v: Transpose[T], v2: U): R = {
dot(v.inner, v2)
}
}
}
但请注意,Intellij IDE无法找到任何用法。我试图找到DenseMatrix和DenseVector如何实现转置。
答案 0 :(得分:2)
我坦率地承认这些含义可能有点难以理解。 NumericOps的.t方法(DenseVector和DM从中获取)定义如下:
final def t[TT >: This, That](implicit op: CanTranspose[TT, That]) =
op.apply(repr)
DenseMatrix有一个隐含的CanTranspose定义如下:
implicit def canTranspose[V]: CanTranspose[DenseMatrix[V], DenseMatrix[V]] = {
new CanTranspose[DenseMatrix[V], DenseMatrix[V]] {
def apply(from: DenseMatrix[V]) = {
new DenseMatrix(data = from.data, offset = from.offset,
cols = from.rows, rows = from.cols,
majorStride = from.majorStride,
isTranspose = !from.isTranspose)
}
}
}
相关位是isTranspose布尔值(以及行和列的交换)的翻转。因此,DenseMatrix上的“.t”只会创建一个新的DenseMatrix,它是列主要的(!isTranspose)和行主要的(isTranpose)。
DenseVector一般没有隐含的CanTranspose。相反,Tensor伴侣对象中的所有Tensors都有一个隐式定义:
implicit def transposeTensor[K, V, T](implicit ev: T<:<Tensor[K, V]): CanTranspose[T, Transpose[T]] = {
new CanTranspose[T, Transpose[T]] {
def apply(from: T): Transpose[T] = new Transpose(from)
}
}
所以dv.t给出了Transpose [DenseVector]。
希望有所帮助!