Traduci le espressioni MATLAB contenenti "^" power operator alla sintassi C ++ [closed]

-1

In breve: Ho diverse espressioni matematiche molto grandi scritte nella sintassi Matlab / Octave. io voglio valutarli all'interno di una funzione C ++ copiandoli e incollandoli, tuttavia il problema è che contengono operatori "^" che non possono essere sovraccaricati per funzionare con i doppi.

Dettagli: Le espressioni consistono in variabili scalari con funzioni trigonometriche nidificate, operatori di addizione e moltiplicazione e operatori di potenza "^". Ci sono così tante espressioni che non è pratico modificarle manualmente per essere compatibili con C ++. Il problema principale si presenta con l'operatore di potenza "^" che è riservato in C ++ per l'operazione OR esclusiva bit a bit. Sto sviluppando questo codice per funzionare su Ubuntu 14.04 LTS con gcc versione 4.9.2.

Chiedo consigli su come procedere / commentare le seguenti tre idee:

1) Scrivi una nuova classe composta da variabili "double-like" e un operatore "^" sovraccarico, nonché operatori "+, *, -" e funzioni trigonometriche.

2) Scrivi del codice per analizzare le espressioni MATLAB, trovare ogni carattere "^", identificare il termine di base "a" e il termine esponente "b" e sostituirli con il pow (a, b)

3) Cerca qualche pacchetto online che abbia già fatto # 1.

Backstory: Sto eseguendo il porting di un grande codice di ottimizzazione che originariamente utilizzava Mathematica per valutare gradienti, jacobiani, ecc. Queste espressioni matematiche sono state convertite in Matlab usando il pacchetto ToMatlab []: link Ora ho bisogno di riscrivere il tutto in C ++.

Ci sono centinaia di espressioni simili a:

 grad_out(1,1) = k1^(-1)*k2^(-1)*(k1*k2*(r+(-1)*R)*cos(b1*k1)+(-1)* 
        k1^2*R*cos((b1+g1)*k1)+k1*k2*R*cos((b1+g1)*k1)+(-1)* 
        k1^2*r*cos((b1+g1)*k1+g1*k2)+k1^2*R*cos((b1+g1)*k1+g1* 
        k2)+k1^2*r*cos((b1+g1)*k1+(b2+g1)*k2)+(-1)*k1^2*k2*L* 
        sin((b1+g1)*k1));
    
posta axplusbu 09.01.2016 - 17:51
fonte

2 risposte

0

La toolbox simbolica di Matlab può generare codice C da un'espressione matlab utilizzando ccode :

syms b1 b2 g1 g2 k1 k2 L r R x1
ccode(k1^(-1)*k2^(-1)*(k1*k2*(r+(-1)*R)*cos(b1*k1)+(-1)*k1^2*R*cos((b1+g1)*k1)+k1*k2*R*cos((b1+g1)*k1)+(-1)*k1^2*r*cos((b1+g1)*k1+g1*k2)+k1^2*R*cos((b1+g1)*k1+g1*k2)+k1^2*r*cos((b1+g1)*k1+(b2+g1)*k2)+(-1)*k1^2*k2*L*sin((b1+g1)*k1)))

Uscite

t0 = -(-(k1*k1)*r*cos(k1*(b1+g1)+k2*(b2+g1))-R*(k1*k1)*cos(g1*k2+k1*(b1+g1))+(k1*k1)*r*cos(g1*k2+k1*(b1+g1))+R*(k1*k1)*cos(k1*(b1+g1))+L*(k1*k1)*k2*sin(k1*(b1+g1))+k1*k2*cos(b1*k1)*(R-r)-R*k1*k2*cos(k1*(b1+g1)))/(k1*k2);
    
risposta data 09.01.2016 - 22:11
fonte
-1

C # ha espressioni regolari piuttosto potenti, potresti creare un programma a riga di comando o qualcos'altro ...

Questo in C # utilizza le espressioni di raggruppamento bilanciate per abbinare i parenti:

namespace ConsoleApplication13
{
    class Program
    {
        static void Main ( string [] args )
        {
            const string identifier = @"[a-zA-Z0-9_]+";

            string expression = @"grad_out(1,1) = (k1*(2+(3))*k2)^(-1)+k3^(k2+1)+(k4)^(-1)+k5^(k6^k7);";

            System.Console.WriteLine ( expression );
            System.Console.WriteLine ( "\r\n=\r\n" );

            var regExString = @"(?<left>(" + identifier + @")|(((?<L0>\()[^()]*)+([^()]*(?<-L0>\)))+))" + @"\^" + @"(?<right>(" + identifier + @")|(((?<L1>\()[^()]*)+([^()]*(?<-L1>\)))+))";
            var re = new System.Text.RegularExpressions.Regex ( regExString );

            bool changed;
            do
            {
                var nextExpression = re.Replace ( expression, @"pow(${left},${right})" );
                changed = nextExpression != expression;
                expression = nextExpression;
            } while ( changed );

            System.Console.WriteLine ( expression );
        }
    }
}

Output:

grad_out(1,1) = pow((k1*(2+(3))*k2),(-1))+pow(k3,(k2+1))+pow((k4),(-1))+pow(k5,(pow(k6,k7)));

Vedi anche link , e link

    
risposta data 09.01.2016 - 21:05
fonte

Leggi altre domande sui tag