2012-04-01 47 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