Это мой первый пост здесь, поэтому спасибо заранее и терпите меня, если я не буду следовать руководству по формату.
Моя проблема заключается в следующем: у меня есть несколько полиномиальных выражений в переменной "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 для своего программирования, хотя я ни в коем случае не обладаю всеми его функциями.Я открыт для любых предложений и очень ценю вашу помощь.