2016-09-29 10 views
0

저는 매스 매 티카에서 좀 새로운 것이고 제 코드에는 많은 시간이 걸릴 것이라고 생각합니다. 다른 방법으로 최적화하는 방법이 있다는 것을 알고 있지만 달성 방법을 정확히 알 수는 없습니다. 생각보다 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]]]&; 
+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 
] 

:이 사람은 아마 가장 쉬운 솔루션입니다 다른 목록의 Length 통해 실행 티카에서 Do 또는 For 루프를 수행하려는 경우, 당신이 그것을 할 수있는 방법을 찾으려고 Map 제품군의 기능 (Map, MapIndexed, MapAt, MapThread 등)을 사용하고 익숙해 져야합니다. 그들은 반복을 대체 할 수 있습니다!

그 다음에 첫 번째 요소와 마지막 요소 인 shocksAppendTo과 함께 추가 할 수 있습니다.

여기에 무료 팁이 있습니다. 매쓰 매 티카에서는 변수와 함수 이름에 대문자 (예 : BucketPivots)를 사용하지 않는 것이 좋습니다. 매쓰 매 티카의 모든 심볼은 대문자로 시작하므로, 여러분이 직접 시작하지 않으려면 빌드 인 함수와 충돌하지 않아야합니다.