【问题标题】:Why is DenseVector a mutable collection?为什么 DenseVector 是一个可变集合?
【发布时间】:2017-03-21 08:01:42
【问题描述】:

通常(到目前为止一直)我尝试在 Scala 中使用不可变集合,特别是如果我将一个集合的引用引用到程序的其他部分,我就不会意外覆盖原始源。使用微风,我想知道:为什么决定让 DenseVector 成为可变集合?

这只是在后台使用数组的一个(可能不需要的)副作用吗?如果是这样,为什么使用数组,而不是另一个(不可变的)集合?

【问题讨论】:

    标签: scala scala-breeze


    【解决方案1】:
    1. 性能。

      Breeze uses netlib-java for its core linear algebra routines. This includes all the cubic time operations, matrix-matrix and matrix-vector multiplication. Special efforts are taken to ensure that arrays are not copied.

      由数组以外的任何东西支持的DenseVector 会明显变慢。它可以包装一个 ImmutableArray 包装一个 Array,但这会强制执行一些操作,这些操作可以通过就地复制来避免复制,可能与专业化进行奇怪的交互等。

    2. 我不知道这有多重要(我怀疑不是很重要),但是对于从数值计算(而不是从 Scala)来到 Breeze 的人来说,可变性是可以预料的。例如。它使得将在 Matlab 或 R 中实现的算法移植到 Breeze 变得更加简单。

    【讨论】:

    • 2.我似乎只对了一半:在 R 中执行 a=c(1,2); b=a; a[1]=0a 将是 0 2 3,而 b 将是 1 2 3。 Scala 中的等价物是不可变的var
    • 虽然,如果 DenseVector 是不可变的,我将不得不写 a = a(1) := 0
    • 是的,Breeze 在这方面表现得像 Numpy,而不是 R 或 Matlab (IIRC),这也可能最终使 R/Matlab 用户感到困惑。同样,我怀疑这是一个不充分的理由(如果有的话)。
    【解决方案2】:

    性能。虽然函数式编程提供了出色的抽象和紧凑的代码,但它通常不能提供最快的执行。 Java 数组提供的开销远低于 Scala 集合,因此是高度重复的数字操作的首选。 Breeze DenseVectors 也是同样的方式,并由底层的 java 数组支持。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-30
      • 2011-12-22
      • 1970-01-01
      • 2011-10-17
      • 2018-07-16
      • 2012-01-19
      • 2011-03-11
      相关资源
      最近更新 更多