[PYTHON] Schreiben der C-Sprache mit Sympy (Metaprogrammierung)

Einführung

Was ist ** Metaprogrammierung **?

** Metaprogrammierung ** (Metaprogrammierung) ist eine Art von Programmierung Technik, die die Logik nicht direkt codiert, sondern ein Muster. Programmieren mit Logik auf hoher Ebene, mit der Logik generiert wird

Aussteller: [wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%BF%E3%83%97%E3%83%AD%E3%82%B0%E3 % 83% A9% E3% 83% 9F% E3% 83% B3% E3% 82% B0)

Kurz gesagt: ** Schreiben Sie Code, der Code generiert, und schreiben Sie komplexen Code! ** Das (ich interpretiere es. Bitte lassen Sie mich wissen, wenn Sie einen Fehler machen).

Überblick

** Generieren Sie Formeln mit der Python-Symbolberechnungsbibliothek Sympy und konvertieren Sie sie in die Sprache C. ** Sympy scheint häufig für die Verarbeitung von Formeln wie Mathematica verwendet zu werden, hat aber auch die Funktion, Formeln in verschiedene Sprachen zu konvertieren. Ich habe es nicht viel benutzt, aber es hat auch die Fähigkeit, eine Funktion mit einer Header-Datei auszugeben.

In diesem Artikel werden wir als Einführung den Multiplikationscode der ** n × n-Matrix mit Sympy metaprogrammieren. ** ** ** Die Notation und Verwendung von Sympy sind unten zusammengefasst. Bitte lesen Sie sie, wenn Sie interessiert sind.

Installation

Sie können Sympy mit pip installieren.

pip install sympy

Zum Download klicken Sie unten.

importieren

Importieren Sie zunächst Sympy.

from sympy import *

Da wir diesmal die Matrixberechnung implementieren möchten, werden wir auch die Matrix importieren.

from sympy import Matrix

Jetzt können Sie auch Matrix deklarieren.

Ein Symbol erstellen

In Formeln verwendete Variablen müssen im Voraus als Symbol deklariert werden. Zum Beispiel, um x und y als Symbol zu deklarieren

x = symbols('x')
y = symbols('y')

Wenn ja, ist es OK. Dieses Mal definieren wir für die Matrixberechnung das Symbol als ein Element der n × n-Matrix.

n = 3
A = Matrix([[symbols('a['+str(j)+']['+str(i)+']') for i in range(n)] for j in range(n)])
B = Matrix([[symbols('b['+str(j)+']['+str(i)+']') for i in range(n)] for j in range(n)])

Nun werden die Matrizen A und B wie folgt deklariert: Hier ist n = 3.

⎡a[0][0]  a[0][1]  a[0][2]⎤
⎢                         ⎥
⎢a[1][0]  a[1][1]  a[1][2]⎥
⎢                         ⎥
⎣a[2][0]  a[2][1]  a[2][2]⎦

⎡b[0][0]  b[0][1]  b[0][2]⎤
⎢                         ⎥
⎢b[1][0]  b[1][1]  b[1][2]⎥
⎢                         ⎥
⎣b[2][0]  b[2][1]  b[2][2]⎦

Die Ausgabe der Matrix kann auf diese Weise visuell verstanden werden, indem "pprint (A)" geschrieben wird.

Matrix-Multiplikation

Das Produkt der vorhergehenden Matrizen A und B sei die Matrix C. Das Multiplizieren der Matrix ist einfach und das Folgende ist in Ordnung.

C = A*B

Betrachten Sie nun den Inhalt mit print (C)

Matrix([[a[0][0]*b[0][0] + a[0][1]*b[1][0] + a[0][2]*b[2][0], a[0][0]*b[0][1] + a[0][1]*b[1][1] + a[0][2]*b[2][1], a[0][0]*b[0][2] + a[0][1]*b[1][2] + a[0][2]*b[2][2]], [a[1][0]*b[0][0] + a[1][1]*b[1][0] + a[1][2]*b[2][0], a[1][0]*b[0][1] + a[1][1]*b[1][1] + a[1][2]*b[2][1], a[1][0]*b[0][2] + a[1][1]*b[1][2] + a[1][2]*b[2][2]], [a[2][0]*b[0][0] + a[2][1]*b[1][0] + a[2][2]*b[2][0], a[2][0]*b[0][1] + a[2][1]*b[1][1] + a[2][2]*b[2][1], a[2][0]*b[0][2] + a[2][1]*b[1][2] + a[2][2]*b[2][2]]])

Sie können sehen, dass die Berechnung ordnungsgemäß durchgeführt wird.

In C-Sprache konvertieren

Konvertierung in C-Sprache

ccode(<Formel>, <Zuzuweisende Variable>, standard='C99')

Es wird beschrieben als. Dieses Mal möchte ich also alle Elemente der Matrix C konvertieren und ausgeben

for i in range(n):
	for j in range(n):
		idx = i*n+j
		code = ccode(C[idx],assign_to=('c['+str(i)+']['+str(j)+']'), standard='C89')
		print(code)

Es wurde gemacht. idx = i * n + j ist ein Ausdruck, der i und j in eine Dimension transformiert. Wenn der obige Code ausgeführt wird, wird Folgendes ausgegeben.

c[0][0] = a[0][0]*b[0][0] + a[0][1]*b[1][0] + a[0][2]*b[2][0];
c[0][1] = a[0][0]*b[0][1] + a[0][1]*b[1][1] + a[0][2]*b[2][1];
c[0][2] = a[0][0]*b[0][2] + a[0][1]*b[1][2] + a[0][2]*b[2][2];
c[1][0] = a[1][0]*b[0][0] + a[1][1]*b[1][0] + a[1][2]*b[2][0];
c[1][1] = a[1][0]*b[0][1] + a[1][1]*b[1][1] + a[1][2]*b[2][1];
c[1][2] = a[1][0]*b[0][2] + a[1][1]*b[1][2] + a[1][2]*b[2][2];
c[2][0] = a[2][0]*b[0][0] + a[2][1]*b[1][0] + a[2][2]*b[2][0];
c[2][1] = a[2][0]*b[0][1] + a[2][1]*b[1][1] + a[2][2]*b[2][1];
c[2][2] = a[2][0]*b[0][2] + a[2][1]*b[1][2] + a[2][2]*b[2][2];

Jedes Element der Matrix C wurde berechnet und in C-Sprachform ausgegeben. Richtig, ist auch beigefügt. Alles was Sie tun müssen, ist dies in Ihren Code einzufügen.

Quellcode

Dies ist der diesmal erstellte Matrixberechnungscode.

from sympy import *
from sympy import Matrix
from sympy.utilities.codegen import codegen
n = 3
A = Matrix([[symbols('a['+str(j)+']['+str(i)+']') for i in range(n)] for j in range(n)])
B = Matrix([[symbols('b['+str(j)+']['+str(i)+']') for i in range(n)] for j in range(n)])
pprint(A)
pprint(B)
C = A*B
print(C)
for i in range(n):
	for j in range(n):
		idx = i*n+j
		code = ccode(C[idx],assign_to=('c['+str(i)+']['+str(j)+']'), standard='C89')
		print(code)

Zusammenfassung

Ich habe den Code metaprogrammiert, um die Matrixmultiplikation mit Sympy zu berechnen. Diese Art der Berechnung kann ohne Metaprogrammierung geschrieben werden, ist jedoch sehr nützlich, wenn eine komplizierte Formel wie "Wie viele Ordnungen der partiellen Differenzierung der ursprünglichen Formel mit t" implementiert wird. (Gibt es einen Vorteil, dass die Ausführungsgeschwindigkeit der Matrixmultiplikation ein wenig zunimmt, weil es keine for-Anweisungen gibt?)

Wir hoffen auf Ihre Referenz!

Recommended Posts

Schreiben der C-Sprache mit Sympy (Metaprogrammierung)
Segfo mit 16 Zeichen in C-Sprache
Erstellen Sie eine Entwicklungsumgebung für die C-Sprache mit einem Container
Schreiben von Protokollen in eine CSV-Datei (Python, C-Sprache)
C / C ++ - Debugging mit gdb
C-Sprache ALDS1_3_B Warteschlange
[C-Sprachalgorithmus] Endianness
Überlagern Sie Diagramme mit Sympy
Mach dir mit Sympy keine Sorgen
[C-Sprachalgorithmus] Blockbewegung
[Python] Löse Gleichungen mit Sympy
Einbettung der Maschinensprache in die Sprache C.
C-Sprache ALDS1_4_B Binäre Suche
Heap-Sortierung in C-Sprache
Bewegungsgleichung mit Sympy
[C Sprache] readdir () vs readdir_r ()
Formatieren Sie die Sprachquelle C mit pycparser
C-Sprache ALDS1_4_A Lineare Suche
Verwenden wir das Entwurfsmuster wie die Sprache C mit OSS design_pattern_for_c!