Сбор непересекающихся подобных терминов в полиномиальных выражениях - PullRequest
3 голосов
/ 01 апреля 2012

Это мой первый пост здесь, поэтому спасибо заранее и терпите меня, если я не буду следовать руководству по формату.

Моя проблема заключается в следующем: у меня есть несколько полиномиальных выражений в переменной "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 Ответ

1 голос
/ 02 апреля 2012

Используя стандартные core-utils, вы можете сделать следующее:

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

На простом английском языке это означает: прочитать файл, преобразовать все пробелы и плюсы в новые строки. Затем сохраняйте только строки, содержащие умножение, сортируйте их и отображайте уникальные вхождения с частотой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...