【问题标题】:Mathematica optimization append table in a loopMathematica 优化在循环中追加表
【发布时间】:2016-09-29 23:57:57
【问题描述】:

我是 Mathematica 的新手,我的代码中有很多 appendto,我认为这会占用一些时间。我知道还有其他一些优化方法,但我不能真正知道如何实现。我觉得getBucketShocks可以改进很多?有人吗?

getBucketShocks[BucketPivots_,BucketShock_,parallelOffset_:0]:=
Module[{shocks,pivotsNb},
shocks={};
pivotsNb=Length[BucketPivots];
If[pivotsNb>1,  
    AppendTo[shocks,LinearFunction[{0,BucketShock},{BucketPivots[[1]],BucketShock},{BucketPivots[[2]],0},BucketPivots[[2]],0},parallelOffset]];

    Do[AppendTo[shocks,LinearFunction[{BucketPivots[[i-1]],0},{BucketPivots[[i]],BucketShock},{BucketPivots[[i+1]],0},{BucketPivots[[i+1]],0},parallelOffset]],{i,2,pivotsNb-1}];

    AppendTo[shocks,LinearFunction[{BucketPivots[[pivotsNb-1]],0},{BucketPivots[[pivotsNb]],BucketShock},{BucketPivots[[pivotsNb]],BucketShock},{BucketPivots[[pivotsNb]],BucketShock},parallelOffset]],    
    If[pivotsNb==1,AppendTo[shocks,BucketShock+parallelOffset&]];
];
shocks];

LinearInterpolation[x_,{x1_,y1_},{x2_,y2_},parallelOffset_:0]:=parallelOffset+y1+(y2-y1)/(x2-x1)*(x-x1);

LinearFunction[p1_,p2_,p3_,p4_,parallelOffset_:0]:=Which[
#<=p1[[1]],parallelOffset+p1[[2]],
#<=p2[[1]],LinearInterpolation[#,p1,p2,parallelOffset],
#<=p3[[1]],LinearInterpolation[#,p2,p3,parallelOffset],
#<=p4[[1]],LinearInterpolation[#,p3,p4,parallelOffset],
#>p4[[1]],parallelOffset+p4[[2]]]&;

【问题讨论】:

标签: performance optimization wolfram-mathematica


【解决方案1】:

我认为您可以通过使用某种形式的Map 来优化中间Do 循环。在每次迭代中,您都尝试访问 BucketPivots 的 3 个相邻元素。这似乎是使用MovingMap 最容易做到的事情,但是您需要跳过几个环节才能将参数放在正确的位置。这可能是最简单的解决方案:

shocks = MovingMap[
  LinearFunction[
    {#[[1]], 0},
    {#[[2]], BucketShock},
    {#[[3]], 0},
    {#[[3]], 0},
    parallelOffset
  ]&,
  BucketPivots,
  2
]

作为一般原则:如果您想在 Mathematica 中执行 DoFor 循环,该循环在另一个列表的 Length 上运行,请尝试找到一种可以使用 @ 中的函数执行此操作的方法987654329@ 家庭(MapMapIndexedMapAtMapThread 等)并熟悉这些。它们是迭代的绝佳替代品!

在此之后,shocks 的第一个和最后一个元素可以与AppendTo 一起添加。

顺便说一句:这里有一个免费提示。我建议在 Mathematica 中避免使用大写字母开头的变量和函数名称(就像使用 BucketPivots 一样)。 Mathematica 自己的所有符号都以大写字母开头,因此如果您自己避免以它们开头,您将永远不会与内置函数发生冲突。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 2018-06-23
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    • 2014-05-08
    相关资源
    最近更新 更多