scala - 以微风向量或微风矩阵为输入的通用方法
问题描述
我正在尝试实现一种可以接受微风矢量或微风矩阵作为输入的方法。就像是
private def updateExponentialMovingAverage[T](tau: Double, initTheta: T, theta: T): T = {
tau * theta + (1 - tau) * initTheta
}
然而,这引发了重载问题,我找不到合适的类型来限制 T。你有什么建议吗?
解决方案
Breezes 对大多数此类事情使用类型类。最简单的方法是使用VectorSpace
类型类,但不幸的是,对于 DenseMatrices,VectorSpace 类型类在另一个导入之后被门控,我对此感到遗憾。
import breeze.linalg._
import breeze.math._
import breeze.linalg.DenseMatrix.FrobeniusInnerProductDenseMatrixSpace.space
def updateExponentialMovingAverage[T](tau: Double, initTheta: T, theta: T)(implicit vs: VectorSpace[T, Double]): T = {
import vs._
theta * tau + initTheta * (1 - tau)
}
scala> val dv = DenseVector.rand(3)
val dv: breeze.linalg.DenseVector[Double] = DenseVector(0.21025028035007942, 0.6257503866073217, 0.8304592391242225)
scala> updateExponentialMovingAverage(0.8, dv, dv)
val res0: breeze.linalg.DenseVector[Double] = DenseVector(0.21025028035007942, 0.6257503866073217, 0.8304592391242225)
scala> val dm = DenseMatrix.rand(3, 3)
val dm: breeze.linalg.DenseMatrix[Double] = 0.6848513069340505 0.8995141354384266 0.3889904836678608
0.4554398871938874 0.03297082723969558 0.6708501327709948
0.4456539828672945 0.04289112062985678 0.9679002485942578
updateExponentialMovingAverage(0.8, dm, dm)
val res1: breeze.linalg.DenseMatrix[Double] = 0.6848513069340505 0.8995141354384266 0.3889904836678608
0.4554398871938874 0.03297082723969558 0.6708501327709948
0.4456539828672945 0.04289112062985678 0.9679002485942578
推荐阅读
- php - 如何使用 SOAP API 和 laravel 避免多次请求
- java - Java LocalDate 在 Spring bean 中不起作用
- sqlite - 有什么方法可以在 SQLite 中跨多个数据库实现视图?
- javascript - 提交类型表单的 onSubmit() 和 onChange() 事件返回为未定义
- r - 如何使用条形图获得可靠的刻度刻度,这些条形图将数字总结为 ggplot (R) 中的单个条形?
- javascript - 无法在 rails 表单中创建所需的 flatpickr 字段
- svg - 如何删除 SVG 周围的空格?
- apache-kafka - 为主题动态创建消息监听器
- python - 关于 Django 和 SECRET_KEY 的困惑
- python - 无法在python中动态更改变量(分数)