2016-11-07 47 views
0

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

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

回答

3
  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更简单。

+0

2.我看起来只有一半:执行'a = c(1,2); B = A;在R中a [1] = 0,'a'将是'0 2 3',而b将是'1 2 3'。在Scala中相当于一个不可变的'var'。 – Make42

+0

虽然,如果DenseVector将是不可变的,我将不得不写'a = a(1):= 0' – Make42

+0

是的,Breeze在这方面表现得像Numpy,而不是R或Matlab(IIRC),它可能最终导致混淆R/Matlab用户也是如此。再次,我怀疑这是一个薄弱的原因(如果有的话)。 –

1

表现。虽然函数式编程提供了极好的抽象和严格的代码,但它通常不会提供最快的执行。 Java数组提供的开销远远低于Scala集合,因此是高度重复的数字操作的开始。微风DenseVector s是相同的方式,并在后台java数组支持。