scala条件替换_scala - 有没有办法用scala中的高阶方法替换嵌套的For循环 - SO中文参考 - www.soinside.com...

有没有办法用scala中的高阶方法替换嵌套的For循环

问题描述 投票:0回答:1

我有一个mutableList,并希望获取所有行的总和,并根据某些条件将其行替换为其他值。下面的代码对我来说工作正常,但我想问有没有办法摆脱嵌套的for循环,因为循环会降低性能。我想使用scala高阶方法而不是嵌套for循环。我尝试了flodLeft()更高阶的方法来替换单个for循环但是无法实现替换嵌套for循环

def func(nVect : Int , nDim : Int) : Unit = {

var Vector = MutableList.fill(nVect,nDimn)(math.random)

var V1Res =0.0

var V2Res =0.0

var V3Res =0.0

for(i

for (j

var resultant = Vector(i).zip(Vector(j)).map{case (x,y) => x + y}

V1Res = choice(Vector(i))

V2Res = choice(Vector(j))

V3Res = choice(resultant)

if(V3Res > V1Res){

Vector(i) = res

}

if(V3Res > V2Res){

Vector(j) = res

}

}

}

}

scala

1个回答

1

投票

这段代码中没有“for循环”; for语句已被编译器转换为foreach调用,因此它已经使用了高阶方法。这些foreach调用可以明确写出,但它对性能没有任何影响。

使代码编译然后清理它给出了:

def func(nVect: Int, nDim: Int): Unit = {

val vector = Array.fill(nVect, nDim)(math.random)

for {

i

j

} {

val res = vector(i).zip(vector(j)).map { case (x, y) => x + y }

val v1Res = choice(vector(i))

val v2Res = choice(vector(j))

val v3Res = choice(res)

if (v3Res > v1Res) {

vector(i) = res

}

if (v3Res > v2Res) {

vector(j) = res

}

}

}

请注意,使用单个for对结果没有任何影响,它看起来更好!

此时很难进一步改进。唯一可能的并行性是内部map调用,但矢量化这几乎肯定是一个更好的选择。如果choice很昂贵,那么结果可能会被缓存,但是当vector更新时,需要更新此缓存。

如果choice可以在计算完所有交叉总和之后的第二遍中完成,那么它将更加平行,但显然也会改变结果。

热门问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值