【发布时间】:2012-11-30 22:41:45
【问题描述】:
想用“张量”替换乘法符号“*”,用“p_tensor”替换幂符号“^”:
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))。 -
是的,我应该提一下,“张量”仅用于替换符号“*”,这是两个a(i)之间的二元运算符。
-
我想不出一种简单的方法来做到这一点,尤其是在这种特殊情况下......至少不是以任何干净的方式。您可能希望将原始表达式解析为表达式树,然后在必要时将其转换为使用您的操作。
-
由于涉及括号,您很可能必须设置某种解析器来标记输入并单独处理每个标记。
-
@JackManey 知道如何设置某种解析器来标记输入并单独处理每个标记吗?