2016-09-29 7 views
0

私はMathematicaの新機能で、私のコードにはたくさんのappendtoがあります。私はいくつかの他の方法の最適化があることを知っているが、私は本当に達成する方法を正確に知ることはできません。私はgetBucketShocksは多くを改善できると思いますか?誰でも?Mathematica最適化テーブルをループで追加する

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]]]&; 
+0

ここにいくつかのアイデアhttp://stackoverflow.com/q/39599232/1004168 – agentp

答えて

1

私はあなたがMap一つの方法または別のいくつかのフォームを使用することにより、中央Doループに多くを最適化することができると思います。すべての繰り返しで、BucketPivotsの3つの隣接要素にアクセスしようとしています。これは、これがMovingMapで行うのが最も簡単なようですが、適切な場所で引数を取得するには、いくつかのフープをジャンプする必要があります。一般原則として

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

:この1は、おそらく最も簡単な解決策であるあなたが別のリストのLength上で実行されるMathematicaでDoまたはForループを行いたい場合は、あなたがそれを行うことができる方法を探してみてくださいMapファミリー(MapMapIndexedMapAtMapThreadなど)の機能を使用して、それらに精通してください。それらは反復のための大きな代用品です!

この後、shocksの最初と最後の要素にはAppendToを追加できます。

ここに無料のヒントがあります。 Mathematicaでは、変数(例えば、BucketPivotsのように)で始まる変数と関数名を与えることを避けることをお勧めします。 Mathematicaのシンボルはすべて大文字で始まるので、自分で始めるのをやめれば、組み込み関数と衝突することはありません。

関連する問題