У меня есть несколько выражений, которые я сгенерировал в Mathematica, которые я хотел бы экспортировать в исходный код внешней C-программы. "CForm" почти делает то, что я хочу, за исключением того, что возведение в степень выражается в виде вызовов Power()
. Мои выражения включают только малые полномочия, поэтому я бы предпочел, чтобы выражение в C использовало встроенное умножение, а не вызов Power()
.
Например, CForm[2 hgt^2 k1inv^3 mx0 wid^2 + hgt^2 k1inv^3 wid^3]
дает
2*Power(hgt,2)*Power(k1inv,3)*mx0*Power(wid,2) +
Power(hgt,2)*Power(k1inv,3)*Power(wid,3)
.. тогда как я хотел бы сгенерировать:
2*hgt*hgt*k1inv*k1inv*k1inv*mx0*wid*wid +
hgt*hgt*k1inv*k1inv*k1inv*wid*wid*wid
Мои первоначальные попытки выделить внутренние части Power[..]
выражения и переназначить его на умножение с помощью x_Symbol^y_Integer /; y > 1 :> Fold[Times, 1, Table[#1, {#2}]]
были заглушены математикой, немедленно конвертировав мои тщательно сгенерированные подвыражения a*a*a
обратно в Power[a,3]
; -) Я знаю, что это только пытается помочь, но я не могу понять, как попросить его остановиться, в этом случае...
Как я написал этот вопрос, мне пришло в голову, что я могу записать вывод CForm
в строку, а затем выполнить сопоставление строк и манипуляции с ним, но это хороший способ пойти? Я думаю, что я предпочитаю работать над этим как выражение Mathematica, поскольку я делаю свое переназначение, а затем выводю.?