2012-04-01 46 views
3

这是我第一次在这里发表,所以在此先感谢,并且如果我不遵循格式指南,请耐心等待。在多项式表达式中收集不相交的词条

我的问题如下:我在可变几个多项式表达式的“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;在代码的开始处声明。这些正则表达式在整个代码中可能会出现几百次,所以我相信这可以大大提高我的运行时间。另外,我只能将由乘法分隔的事物分组,而不是加法分组。

基本上,我需要一个替换字符串函数,可以找到不相交的字符串,其成员条款因其他条款和*迹象是分开的,但不+迹象。这可能是一个高难度的命令,或者非常简单,我真的不确定。

我有数学,MATLAB,并提供给我枫树和运行Debian的,这样我就可以下载东西,如果它是可能更有帮助开源。我通常使用Emacs进行编程,但我绝不熟悉它的所有功能。我愿意接受任何建议,并非常感谢您的帮助。

+0

如果我理解正确,你想要一个预处理工具来扫描你的源代码的文本,并发布修改后的源代码? – thb 2012-04-01 15:00:02

+0

(顺便说一句,你有数学,MATLAB和Maple运行在* Debian的?*使用Wine吗?这是一个巧妙的技巧。) – thb 2012-04-01 15:02:50

+1

这有可能是你的编译器已经做了一定的[*常见的子表达式消除*]( http://en.wikipedia.org/wiki/Common_subexpression_elimination)。 – 2012-04-01 15:43:36

回答

1

使用标准的核心utils的,你可以做到以下几点:

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

用简单的英语这样的语句:读取文件,所有的空间和长处转换成新线。接下来,只保留包含乘法的行,对它们进行排序,并用它们的频率显示唯一的出现次数。

+0

这看起来像我正在寻找的。我会在今晚尝试。谢谢 – JohnML 2012-04-03 15:48:01

+0

更新:我尝试了user1202136发布的方法,这是我需要的。我并没有完全贯彻所有来源的建议,只是一个测试部分,但我希望这会大大加快该计划的速度。在一个小测试部分中,我已经删除了每次运行约30,000次冗余计算。非常感谢! – JohnML 2012-04-09 14:49:29