在多项式表达式中收集不相似的项

时间:2012-04-01 14:56:07

标签: c++ matlab wolfram-mathematica

这是我在这里的第一篇文章,所以如果我不遵循格式指南,请提前感谢并忍受我。

我的问题如下:我在变量“s”中有几个多项式表达式达到10级。然后,每个系数都是最多10个其他变量的函数。总的来说,所有系数函数的代码占用大约800个文本包装的代码行,其中单个系数具有多达40行代码。我正在用C ++编写一个优化例程,试图确定系数所依赖的10个变量中每个变量的最佳值。

分析我的代码,我发现我将78%的时间用在这个功能上。为了优化,我想搜索整个代码并找到冗余计算,在例程开始时计算它们,并用先前计算的表达式替换它们的所有出现。问题是最常出现的表达式可能是:

a0 = ... + R1*R2*G1*R3 + R1*R2*H1*R3 + ...;

我想找到一种方法来搜索这些行并整理R1*R2*R3个术语,将其替换为X之类的内容,其中X = R1*R2*R3;在代码的开头声明。这些正则表达式在整个代码中可能会出现几百次,因此我确信这可以大大改善我的运行时间。另外,我只能将通过乘法分隔的事物分组,而不是添加。

基本上,我需要一个替换字符串函数,它可以找到不相交的字符串,其成员术语由其他术语和*符号分隔,但不是+符号。这可能是一个很高的要求,或者非常简单,我真的不确定。

我可以使用Mathematica,MATLAB和Maple运行Debian,所以如果它是开源的,我可以下载一些可能更有帮助的东西。我通常使用Emacs进行编程,但我并不熟悉其所有功能。我对任何建议持开放态度,非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

使用标准的core-utils,您可以执行以下操作:

cat filename.cc | tr " +" "\n\n" | grep "*" | sort | uniq -c

简单的英语翻译为:读取文件,转换所有空格并加入新行。接下来,只保留包含乘法的行,对它们进行排序,并以频率显示唯一的出现次数。