想替換乘法符號「*」和「張量」,和電源符號「^」與「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
但是,當符號「*」是一個數字之間a(i),如3 * 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'似乎應該是'tensor(3,p_tensor(2,a(3))'。 – ceyko
是的,我應該提到這一點,「張量」只用於用兩個a(i)之間的二元運算符替換符號「*」 –
我想不出一種簡單的方法來做到這一點,特別是在這種特殊情況下......至少不是以任何干淨的方式。以查看將原始表達式解析爲表達式樹,然後將其轉換爲在必要時使用您的操作。 – ceyko