は、乗算記号「*」「テンソル」とし、「p_tensor」を使用して、以下の置換規則と電源記号「^」に置き換えたい:AWKまたはsedまたはPerlでそのような置換を行う方法は?
a(k)^n --> p_tensor(n,a(k))
a(i)*a(j) --> tensor(a(i),a(j)), when i=/=j
しかしを記号「*」は番号の間にあるときと、 3 * a(i)のようなa(i)の場合、シンボル「*」はそのまま保持する必要があります。
ので、たとえば、
5*a(i)*a(j)*(a(k1)+3*a(k2)) --> 5*tensor(tensor(a(i),a(j)),a(k1)+3*a(k2))
a(i)^2*a(j)^2 --> tensor(p_tensor(2,a(i)),p_tensor(2,a(j)))
...
は今、私はAWKやsedのか、Perlを使用して、以下の式を再フォーマットする:
3*a(3)^2+6*a(1)^2*(5*a(2)^2-2*a(4))+6*a(2)*a(4)+6*a(1)*(-4*a(2)*a(3)+a(5))
任意のアイデアはどのように?置換後の
期待される結果は
3*p_tensor(2,a(3))+6*tensor(p_tensor(2,a(1)),(5*p_tensor(2,a(2))-2*a(4))+6*tensor(a(2),a(4))+6*tensor(a(1),(-4*tensor(a(2),a(3))+a(5))
なぜ '*'の一部を 'tensor'で置き換えるのですか?つまり、最初の '3 * a(3)^ 2'は' 'テンソル(3、p_tensor(2、a(3))' 'のように見えます。 – ceyko
2つのa(i)の間のバイナリ演算子であるシンボル "*"を置き換えてください。 –
私は単純な方法、特にその特殊なケースを考えることはできません...少なくともクリーンな方法ではありません。元の式を構文木に構文解析し、必要に応じて演算を使用するように変換します。 – ceyko