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 层次结构的相对迷宫。部分作品:
- 特征 CanTranspose
- class/object 转置和关联隐式
- trait/object 具有相应隐式的 numericOps:
- 特质 TransposeLowPrio
这是我正在寻找的可能示例:在 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]。
希望对您有所帮助!
<foo>.t(..) // .t() is transpose
[DenseVector|DenseMatrix] 的方法是隐式、特征和 class 层次结构的相对迷宫。部分作品:
- 特征 CanTranspose
- class/object 转置和关联隐式
- trait/object 具有相应隐式的 numericOps:
- 特质 TransposeLowPrio
这是我正在寻找的可能示例:在 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]。
希望对您有所帮助!