2011-10-08 28 views
6

Tôi có một biểu thức dài mà tôi muốn chia thành một tập hợp các thuật ngữ. Ví dụ nói rằng tôi có:Chia biểu thức thành tập hợp các cụm từ

a + b - c + d + 4*e - 3*f 

Tôi muốn chia biểu thức bằng cách thêm/trừ vào:

{a, b, -c, d, 4*e, -3*f} 

Động lực của tôi cho điều này là tôi muốn để đối phó với hạn biểu hiện ban đầu bằng cách hạn. Điều này có thể không?

Chỉnh sửa: Các ví dụ được đưa ra rất đơn giản so với những gì tôi thực sự đang làm việc trong Mathematica, chỉ là tôi không biết cách viết Toán ở đây.

Trả lời

9

Để tách biểu thức, bạn cần sử dụng Level. Level cung cấp cho bạn danh sách các biểu thức con và bạn có thể chỉ định cấp mà bạn muốn các biểu thức con được trả về. Trong trường hợp này, bạn cần levelspec 1.

In[1]:= expr = a + b - c + d + 4 e - 3 f; 
In[2]:= Level[expr, 1] 

Out[2]= {a, b, -c, d, 4 e, -3 f} 

Một ví dụ với một biểu hiện hơi phức tạp hơn:

In[3]:= expr2 = a^2 + 5 bc/ef - Sqrt[g - h] - Cos[i]/Sin[j + k]; 
In[4]:= Level[expr2, 1] 

Out[4]= {a^2, (5 bc)/ef, -Sqrt[g - h], -Cos[i] Csc[j + k]} 
4

Bạn cũng có thể có thể sử dụng MonomialList, nếu bạn biểu thức là một đa thức:

In[56]:= MonomialList[a + b - c + d + 4*e - 3*f] 

Out[56]= {a, b, -c, d, 4 e, -3 f} 

(Không hoạt động trên đa thức, chẳng hạn như Yoda's expr2.)

4

Vì không có ai khác đã đề cập đến nó, tương đương với Level[expr, 1] xây dựng Yoda là sử dụng Apply để thay thế người đứng đầu của một biểu thức với List:

In[1]:= expr = a + b - c + d + 4 e - 3 f; 

In[2]:= List @@ expr 
     Level[expr, 1] == % 

Out[2]= {a, b, -c, d, 4 e, -3 f} 
Out[3]= True 


In[4]:= expr2 = a^2 + 5 bc/ef - Sqrt[g - h] - Cos[i]/Sin[j + k]; 

In[5]:= List @@ expr2 
     Level[expr2, 1] == % 

Out[5]= {a^2, (5 bc)/ef, -Sqrt[g - h], -Cos[i] Csc[j + k]} 
Out[6]= True 

Hai phương pháp cơ bản làm điều tương tự và có giống hệt nhau timings (sử dụng phiên bản của tôi về một average timing function)

In[1]:= SetOptions[TimeAv, Method -> {"MinNum", 80000}, "BlockSize" -> 20000]; 

In[7]:= List @@ expr // TimeAv 

Total wall time is 0.244517, total cpu time is 0.13 
and total time spent evaluating the expression is 0.13 

The expression was evaluated 80000 times, in blocks of 20000 runs. This yields 
a mean timing of 1.625*10^-6 with a blocked standard deviation of 2.16506*10^-7. 

Out[7]= {1.625*10^-6, {a, b, -c, d, 4 e, -3 f}} 

In[8]:= Level[expr, 1] // TimeAv 

Total wall time is 0.336927, total cpu time is 0.16 
and total time spent evaluating the expression is 0.16 

The expression was evaluated 80000 times, in blocks of 20000 runs. This yields 
a mean timing of 2.*10^-6 with a blocked standard deviation of 3.53553*10^-7. 

Out[8]= {2.*10^-6, {a, b, -c, d, 4 e, -3 f}} 
3

Bạn cũng có thể sử dụng Replace:

012.
In[65]:= Replace[a + b - c + d + 4*e - 3*f, HoldPattern[Plus[a___]] :> {a}] 

Out[65]= {a, b, -c, d, 4 e, -3 f} 

Bạn cần phải sử dụng HoldPattern (hoặc một số thủ thuật tương đương) để ngăn chặn Plus[a__] từ đánh giá để a__, trong đó có kết quả của chỉ gói đối số đầu tiên trong danh sách thay vì tạo ra một danh sách các đối số cho Plus.

+3

Một khả năng khác cho quy tắc là 'Thêm [a_, b___]:> {a, b}' – Simon

+1

Nếu một ưu tiên 'Thay thế', nó có thể được kết hợp với' Áp dụng' cho một tùy chọn khác: 'Thay thế [a + b - c + d + 4 * e - 3 * f, a_Plus:> Danh sách @@ a] 'Hoặc, có thể:' Thay thế [a + b - c + d + 4 * e - 3 * f, Thêm -> Danh sách, 1 , Thủ trưởng -> Đúng] ' –

Các vấn đề liên quan