使用向量的Scala函数式编程

Rad*_*rer 1 scala

我是Scala编程的新手,在函数式编程和不可变集合方面遇到了一些困难.我试图将我的数字代码从C++移植到Scala.

很多时候我有代码在小向量上运行,如下所示:

double ytmp[6];

for (int i=0; i<6; i++) {
    ytmp[i] = y[i] + h*(a41*dydx[i] + a42*k2[i] + a43*k3[i]);
}
Run Code Online (Sandbox Code Playgroud)

如何在高效的Scala中编写类似的东西?我考虑过在开始时使用简单列表,但是对于不可变类型有问题,所以我不能只创建一个空列表ytmp并稍后修改它,就像我习惯于使用C++一样.谢谢您的帮助

Rex*_*err 5

为了提高效率,你用完全相同的方式写(注意,这不是功能代码),除了while循环.for循环被转换成极其低效(但非常出色的通用和强大)结构.所以,在这种情况下,你(警告,未经测试):

val ytmp = new Array[Double](6)
var i = 0
while (i < 6) {
  ytmp(i) = y(i) + h*(a41*dydx(i) + a42*k2(i) + a43*k3(i))
  i += 1
}
Run Code Online (Sandbox Code Playgroud)

通常,它的运行速度与C++代码一样快.

你开始,一旦你换这样原始的东西成类,然后在大量的这些类与操作以从斯卡拉受益map,foreach等.

但是对于数字代码,你要么编写漂亮但令人尴尬的慢速代码(从C++的角度来看),要么是丑陋但性能正常的代码(是的,与C类C++相比,丑陋).

由于我做了很多,我尝试将这个丑陋但快速的代码放在漂亮的库中,然后尽可能地忘记它并在库启用的更高级别工作.