Scala breeze 中转置(DenseMatrix 或 DenseVector)的低级实现在哪里?

Where are low level implementations for transpose (DenseMatrix or DenseVector) in Scala breeze?

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

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

这是我正在寻找的可能示例:在 Transpose object 中有以下 low-level 代码("dot"):

  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 如何实现转置。

我承认隐式可能有点难以理解。 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。相反,在张量伴随对象中为所有张量定义了一个隐式:

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

希望对您有所帮助!