2011-12-08 21 views
1

私は多くの用語の和であるMathematica式(exprと呼ばれる)を持っています。また、これらの用語のいくつかに現れるかもしれない変数と関数のいくつかを持つリスト(varと呼ばれる)があります。パターンを組み合わせて用語を集める

最初にやりたいことは、いくつかの変数と機能を含む用語を特定の回数抽出することです。たとえば、var = {a, f[_]}の場合、変数aと関数fを2回含む変数をすべて抽出することができます。 f[f[a + b]]は、これらの基準を満たす用語の例です。

私がやりたいことは、元の式のすべての項を一度に含むリスト(出力と呼ばれる)を作成することです。リストには、varに指定された変数と関数が含まれている回数に基づいて用語がグループ化されていなければなりません。 var = {a, f[_]}の出力はoutput = {{sum of those terms containing 0 * a and 0 * f[_], "sum of..." 1 * a and 0 f, "sum of..." 2a 0f, ... }, {"sum of..." 0a 1f, "sum of..." 1a, 1f, ... }}

が問題2の解決策を考えるだろう、それは問題1を解決することは容易である:式の特定の用語を抽出するには、あなただけのリスト出力から右の要素を選択する必要があります。そのために、問題2を解決しようとしました。事を明確にするために、私は単純な表現で始まりました。まず、私はパターンのリスト

expr = f[a + f[y]] 
var = {{a, 1}, {f[_], 3}} 
basicpattern[symbol_, n_, term_] = 
Hold[Table[Count[{term}, symbol, 10] == i, {i, 0, n}]] 
basicpattern[#1, #2, expr] & @@@ var // ReleaseHold 

出力は

{{False, True}, {False, False, True, False}} 

ですが生成解釈があることである:変数aが1回発生し、関数fは2回表示されます。 ここでは、パターンの組み合わせを作るために基本パターン内のリストの外積を取りたいと思います。次に、パターンの新しいリストをCasesと共に使用して、exprからタームを選択してリストに入れます。

ここで私は固まっています:リスト内のリストの外積を取る方法は?私は推測しました

Outer[And, {{True, False}, {True, False, False, False}}, 1] 

しかしこれは8つの言葉を与えません。

更新

私は少しさらに来たSjoerdの助けを借りて。

expr = f[a + f[y]]; 
var = {{a, 1}, {f[_], 3}}; 
basicpattern[symbol_, n_, term_] := 
Table[Hold[Count[{term}, symbol, 10]] == i, {i, 0, n}]; 
basicpattern[#1, #2, expr] & @@@ var; 
Outer[And, ##] & @@ %; 
test = %[[2, 3]] 
%// ReleaseHold 

出力

Hold[Count[{f[a + f[y]]}, a, 10]] == 1 && 
Hold[Count[{f[a + f[y]]}, f[_], 10]] == 2 
True 

として与える解釈は、F [A + F [Y]は一時間Aと二度[_] fを含んでいることです。 外側の製品は、これらのようなテストのリストです。

Iは

はexpr = F [A + F [Y] + G [Z] + y^2にはexprを変更すると仮定 - 13 X + 12A + AF [X]

どのようにすることができテストの内容を使って、1つのaと2つのf [_]を含むすべての条件を収集しますか?

+2

あなたは次のように書いています。「ここは間違っています。Mathematicaはエラーを生成します。」 - エラーを追加するか、(正確に)エラーに再現するコードを追加します。好ましくは両方。 :-) –

+3

正直言って、あなたが達成しようとしていることは本当にはっきりしていませんが、 'var'と' rule'の形式から判断すると '' allrules'の2番目の '/ @ '@@@'にする必要があります。 – Heike

+0

@nilo de roockと平家。コメントありがとうございます。確かに、エラーは@@@の代わりに/ @を使用することから来ました。私は自分の質問を書いています。私はそれを完全に書き直す必要があると思います。ルールは何ですか?私は古い投稿を含める必要がありますか?私はそれを置き換えることはできますか?または、このトピックを削除して新しいトピックを開始する必要がありますか? – sjdh

答えて

1

ユアーズ長い話ですが、私はあなたの質問がに沸く推測:

リスト内のリストの外積を取る方法は?

これが唯一のものであれば、あなたが近くにいることを知りたがっている場合。

booleanLists = {{True, False}, {True, False, False, False}}; 

Outer[And, ##] & @@ booleanLists 

(* ==> {{True, False, False, False}, {False, False, False, False}} *) 
+0

ありがとうございます。これで私は解決策に一歩近づいています。私は、問題を明確な方法で述べることはできなかったと思います。私は私の質問を更新しようとします。 – sjdh

関連する問題