1

在...后面

<foo>.t(..)  // .t() is transpose 

[DenseVector|DenseMatrix] 的方法是隐含、特征和类层次结构的相对迷宫。部分作品:

  • 特征 CanTranspose
  • 类/对象转置和相关的隐式
  • 具有相应隐式的特征/对象 numericOps:
  • 特征 TransposeLowPrio

这是我正在寻找的一个可能示例:在 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 如何实现转置。

4

1 回答 1

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 伴生对象中为所有张量定义了一个隐式定义:

  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]。

希望有帮助!

于 2015-01-19T09:26:30.613 回答