【问题标题】:Where are low level implementations for transpose (DenseMatrix or DenseVector) in Scala breeze?Scala 微风中转置(DenseMatrix 或 DenseVector)的低级实现在哪里?
【发布时间】:2015-01-19 17:26:30
【问题描述】:

背后

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

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

  • 特质cantranspose
  • 类/对象转置和关联的隐含
  • trait/object 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 如何实现转置。

【问题讨论】:

    标签: scala scala-breeze


    【解决方案1】:

    我坦率地承认,隐含可能有点难以理解。 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 伴生对象中为所有 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]。

    希望有帮助!

    【讨论】:

    • 请随时在此处或邮件列表中提出更多问题。我尽我所能回应。一般来说,Breeze 试图概括(几乎病态地如此),以便可以根据其他操作来定义操作。例如,我们可以为任何具有转置和矩阵乘法的类型定义一个稀疏 svd。大部分复杂性都为此服务。
    • 哇,这是一个了不起的答案,谢谢!我只是在学习微风,只是想在昨晚睡前学习这个。很想找到/支付一本使用这种语言的书(即使它是在亚马逊上自行出版的 PDF ......)
    • 谢谢!我曾考虑写一本书,并且我打算这样做,但我现在的带宽非常有限。你有没有一本我最喜欢的关于 numpy(或 Julia、Matlab 或其他东西)的书,我可以将其视为灵感?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    相关资源
    最近更新 更多