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

时间:2015-01-18 23:20:00

标签: scala scala-breeze

后面
<foo>.t(..)  // .t() is transpose 
  • 特质CanTranspose
  • class / object Transpose和related implicits
  • 具有相应含义的trait / object numericOps:
  • trait 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如何实现转置。

1 个答案:

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

希望有所帮助!