2010-07-09 7 views
4

이것은 관련된 토론에서 유래했습니다. How to subtract specific elements in a list using functional programming in Mathematica?Mathematica에서 함수형 프로그래밍을 사용하여 목록에있는 요소 간의 백분율 차이를 계산 하시겠습니까?

목록의 값 차이 백분율을 계산하는 방법은 무엇입니까?

링크 된 질문은 차이를 사용하여 목록의 연속 요소 간의 절대 차이를 쉽게 계산합니다. 그러나 내장 된 Differences 함수를 사용하면 특별한 문제가 발생하기 쉽지만 다른 조작을 수행하는 방법은 여전히 ​​문제가됩니다.

앞에서 언급했듯이 지금 나는 백분율 차이를 계산하려고합니다. 요소 목록 인 {value1, value2, ..., valueN}이 주어지면 (value2-value1)/value1과 같은 작업을 어떻게 수행 할 수 있습니까?

Slot 또는 SlotSequence을 사용하여 특정 요소를 격리 한 다음 사용자 지정 기능을 적용하는 방법을 찾으려고 시도했습니다. 이것은 (요소를 격리하고 그 위에서 작업을 수행하는 방법이 있다고 가정 할 때) 이와 같은 것을하는 가장 효율적인 방법입니까?

답변

9

은 그것을 할 수있는 몇 가지 자연적인 방법이 있습니다.

당신은 Partition를 사용하여 "비율 감소"함수에 인수의 목록을 형성 할 수 : 다음

In[3]:= list = {a, b, c, d, e}; 

In[4]:= Partition[list, 2, 1] 

Out[4]= {{a, b}, {b, c}, {c, d}, {d, e}} 

할 수 있습니다 Apply 다음에 기능 :

In[6]:= f @@@ Partition[list, 2, 1] 

Out[6]= {f[a, b], f[b, c], f[c, d], f[d, e]} 

귀하 % 감소 기능을 사용 :

In[7]:= PercentDecrease[a_, b_] := (b - a)/a 

In[8]:= PercentDecrease @@@ Partition[list, 2, 1] 

Out[8]= {(-a + b)/a, (-b + c)/b, (-c + d)/c, (-d + e)/d} 

(@@@ 저서 읽기 "추가 정보"에서 찾고 Apply에서 노트) 대신 파티션의

당신이 MapThread을 사용하여 결합 후 제 1 및 제 2 인자의 목록을 형성 MostRest을 사용할 수 있습니다.

In[14]:= MapThread[PercentDecrease, {Most[list], Rest[list]}] 

Out[14]= {(-a + b)/a, (-b + c)/b, (-c + d)/c, (-d + e)/d} 

다른에게

In[10]:= Differences[list]/Most[list] 

Out[10]= {(-a + b)/a, (-b + c)/b, (-c + d)/c, (-d + e)/d} 

나눗셈 연산 (/) threads T 개의 위에 : 방법은 동작이 같은 두 단계 (a 뺄셈과 나눗셈)을 형성하는 것이다 wo는 Differences[list]Most[list를 나열합니다.

+0

위대한 답변! 그런데, 나는이 설명을 @@@ 더 좋아한다. http://stackoverflow.com/questions/1141166/in-mathematica-what-does-mean/1141701#1141701 – dreeves

+1

+1, 좋은 대답. 나는 개인적으로, 마지막 하나가 최고 인 것처럼. 비록 '차이점 [#]/Most [#] & @ list'라고 쓰고 있지만, 그건 저뿐입니다. – rcollyer

관련 문제