https://itp.tugraz.at/wiki/index.php?title=CausMatlabStarten&feed=atom&action=history
CausMatlabStarten - Versionsgeschichte
2024-03-29T05:23:31Z
Versionsgeschichte dieser Seite in Physik
MediaWiki 1.34.2
https://itp.tugraz.at/wiki/index.php?title=CausMatlabStarten&diff=2826&oldid=prev
129.27.157.23 am 13. Jänner 2005 um 13:50 Uhr
2005-01-13T13:50:19Z
<p></p>
<table class="diff diff-contentalign-left" data-mw="interface">
<col class="diff-marker" />
<col class="diff-content" />
<col class="diff-marker" />
<col class="diff-content" />
<tr class="diff-title" lang="de-AT">
<td colspan="2" style="background-color: #fff; color: #222; text-align: center;">← Nächstältere Version</td>
<td colspan="2" style="background-color: #fff; color: #222; text-align: center;">Version vom 13. Jänner 2005, 13:50 Uhr</td>
</tr><tr>
<td colspan="2" class="diff-lineno">Zeile 1:</td>
<td colspan="2" class="diff-lineno">Zeile 1:</td>
</tr>
<tr>
<td class="diff-marker"> </td>
<td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Hier ist ein Beispielprogramm, mit dem aus einem Matlab Script eine vorkompilierte in C++ geschriebene Funktion ausgeführt wird. </div></td>
<td class="diff-marker"> </td>
<td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Hier ist ein Beispielprogramm, mit dem aus einem Matlab Script eine vorkompilierte in C++ geschriebene Funktion ausgeführt wird. </div></td>
</tr>
<tr>
<td class="diff-marker"> </td>
<td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div><br><br></div></td>
<td class="diff-marker"> </td>
<td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div><br><br></div></td>
</tr>
<tr>
<td class="diff-marker">−</td>
<td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Alle benötigten <del class="diffchange diffchange-inline">dateien</del> für dieses Beispiel sind auf [http://itp.tugraz.at/~golubk_a/download/matlab_c/ matlab_c] zu finden.</div></td>
<td class="diff-marker">+</td>
<td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>Alle benötigten <ins class="diffchange diffchange-inline">Dateien</ins> für dieses Beispiel sind auf [http://itp.tugraz.at/~golubk_a/download/matlab_c/ matlab_c] zu finden.</div></td>
</tr>
<tr>
<td class="diff-marker"> </td>
<td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td>
<td class="diff-marker"> </td>
<td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td>
</tr>
<tr>
<td class="diff-marker"> </td>
<td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Das C Programm: ==</div></td>
<td class="diff-marker"> </td>
<td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Das C Programm: ==</div></td>
</tr>
<tr>
<td class="diff-marker">−</td>
<td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Interresant ist vorallem die <del class="diffchange diffchange-inline">verwendung</del> der Matlab Variablendeffinitionen, in mexFunction(). mexFunction() wird statt main() beim <del class="diffchange diffchange-inline">aufruf</del> des <del class="diffchange diffchange-inline">programms</del> gestartet! Hier findet die übersetzung der Matlab Variablen in C statt (mxGetScalar usw.). Es werden Pointer auf die Arrays für die Rückgabe an Matlab gesetzt (mxGetPr). Die Eigentliche Berechnung läuft in der Funktion rechnen(), sie ist natürlich vom zu lösenden Problem abhängig.</div></td>
<td class="diff-marker">+</td>
<td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>Interresant ist vorallem die <ins class="diffchange diffchange-inline">Verwendung</ins> der Matlab Variablendeffinitionen, in mexFunction(). mexFunction() wird statt main() beim <ins class="diffchange diffchange-inline">Aufruf</ins> des <ins class="diffchange diffchange-inline">Programms</ins> gestartet! Hier findet die übersetzung der Matlab Variablen in C statt (mxGetScalar usw.). Es werden Pointer auf die Arrays für die Rückgabe an Matlab gesetzt (mxGetPr). Die Eigentliche Berechnung läuft in der Funktion rechnen(), sie ist natürlich vom zu lösenden Problem abhängig.</div></td>
</tr>
<tr>
<td class="diff-marker"> </td>
<td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Die C funktion wird mit dem Befehl <tt>mex funktionname.cc </tt> also in diesem Beispiel <tt>mex c_function.cc</tt> kompiliert.</div></td>
<td class="diff-marker"> </td>
<td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Die C funktion wird mit dem Befehl <tt>mex funktionname.cc </tt> also in diesem Beispiel <tt>mex c_function.cc</tt> kompiliert.</div></td>
</tr>
<tr>
<td class="diff-marker"> </td>
<td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Es ist empfehlenswert Matlab mit dem Befehl <tt>matlab -check_malloc</tt> aus einem [[Terminal]] zu starten. Matlab überprüft dann automatisch ob ein pointer beim zugriff auf die "mex" Funktionen aus dem zugewiesenen speicher "rausläuft". </div></td>
<td class="diff-marker"> </td>
<td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Es ist empfehlenswert Matlab mit dem Befehl <tt>matlab -check_malloc</tt> aus einem [[Terminal]] zu starten. Matlab überprüft dann automatisch ob ein pointer beim zugriff auf die "mex" Funktionen aus dem zugewiesenen speicher "rausläuft". </div></td>
</tr>
</table>
129.27.157.23
https://itp.tugraz.at/wiki/index.php?title=CausMatlabStarten&diff=281&oldid=prev
129.27.157.23 am 13. Jänner 2005 um 13:49 Uhr
2005-01-13T13:49:08Z
<p></p>
<table class="diff diff-contentalign-left" data-mw="interface">
<col class="diff-marker" />
<col class="diff-content" />
<col class="diff-marker" />
<col class="diff-content" />
<tr class="diff-title" lang="de-AT">
<td colspan="2" style="background-color: #fff; color: #222; text-align: center;">← Nächstältere Version</td>
<td colspan="2" style="background-color: #fff; color: #222; text-align: center;">Version vom 13. Jänner 2005, 13:49 Uhr</td>
</tr><tr>
<td colspan="2" class="diff-lineno">Zeile 1:</td>
<td colspan="2" class="diff-lineno">Zeile 1:</td>
</tr>
<tr>
<td class="diff-marker"> </td>
<td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Hier ist ein Beispielprogramm, mit dem aus einem Matlab Script eine vorkompilierte in C++ geschriebene Funktion ausgeführt wird. </div></td>
<td class="diff-marker"> </td>
<td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Hier ist ein Beispielprogramm, mit dem aus einem Matlab Script eine vorkompilierte in C++ geschriebene Funktion ausgeführt wird. </div></td>
</tr>
<tr>
<td colspan="2" class="diff-empty"> </td>
<td class="diff-marker">+</td>
<td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><br><br></div></td>
</tr>
<tr>
<td class="diff-marker">−</td>
<td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"></td>
<td colspan="2" class="diff-empty"> </td>
</tr>
<tr>
<td colspan="2" class="diff-empty"> </td>
<td class="diff-marker">+</td>
<td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>Alle benötigten dateien für dieses Beispiel sind auf [http://itp.tugraz.at/~golubk_a/download/matlab_c/ matlab_c] zu finden.</div></td>
</tr>
<tr>
<td class="diff-marker"> </td>
<td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td>
<td class="diff-marker"> </td>
<td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td>
</tr>
<tr>
<td class="diff-marker"> </td>
<td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Das C Programm: ==</div></td>
<td class="diff-marker"> </td>
<td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Das C Programm: ==</div></td>
</tr>
<tr>
<td colspan="2" class="diff-lineno">Zeile 6:</td>
<td colspan="2" class="diff-lineno">Zeile 7:</td>
</tr>
<tr>
<td class="diff-marker"> </td>
<td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Die C funktion wird mit dem Befehl <tt>mex funktionname.cc </tt> also in diesem Beispiel <tt>mex c_function.cc</tt> kompiliert.</div></td>
<td class="diff-marker"> </td>
<td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Die C funktion wird mit dem Befehl <tt>mex funktionname.cc </tt> also in diesem Beispiel <tt>mex c_function.cc</tt> kompiliert.</div></td>
</tr>
<tr>
<td class="diff-marker"> </td>
<td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Es ist empfehlenswert Matlab mit dem Befehl <tt>matlab -check_malloc</tt> aus einem [[Terminal]] zu starten. Matlab überprüft dann automatisch ob ein pointer beim zugriff auf die "mex" Funktionen aus dem zugewiesenen speicher "rausläuft". </div></td>
<td class="diff-marker"> </td>
<td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Es ist empfehlenswert Matlab mit dem Befehl <tt>matlab -check_malloc</tt> aus einem [[Terminal]] zu starten. Matlab überprüft dann automatisch ob ein pointer beim zugriff auf die "mex" Funktionen aus dem zugewiesenen speicher "rausläuft". </div></td>
</tr>
<tr>
<td colspan="2" class="diff-empty"> </td>
<td class="diff-marker">+</td>
<td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"></td>
</tr>
<tr>
<td class="diff-marker">−</td>
<td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div><br><br></div></td>
<td colspan="2" class="diff-empty"> </td>
</tr>
<tr>
<td class="diff-marker">−</td>
<td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Alle benötigten dateien für dieses Beispiel sind auf [http://itp.tugraz.at/~golubk_a/download/matlab_c/ matlab_c] zu finden.</div></td>
<td colspan="2" class="diff-empty"> </td>
</tr>
<tr>
<td class="diff-marker"> </td>
<td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td>
<td class="diff-marker"> </td>
<td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td>
</tr>
<tr>
<td class="diff-marker"> </td>
<td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div><pre></div></td>
<td class="diff-marker"> </td>
<td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div><pre></div></td>
</tr>
</table>
129.27.157.23
https://itp.tugraz.at/wiki/index.php?title=CausMatlabStarten&diff=280&oldid=prev
129.27.157.23 am 13. Jänner 2005 um 13:48 Uhr
2005-01-13T13:48:40Z
<p></p>
<p><b>Neue Seite</b></p><div>Hier ist ein Beispielprogramm, mit dem aus einem Matlab Script eine vorkompilierte in C++ geschriebene Funktion ausgeführt wird. <br />
<br />
<br />
== Das C Programm: ==<br />
Interresant ist vorallem die verwendung der Matlab Variablendeffinitionen, in mexFunction(). mexFunction() wird statt main() beim aufruf des programms gestartet! Hier findet die übersetzung der Matlab Variablen in C statt (mxGetScalar usw.). Es werden Pointer auf die Arrays für die Rückgabe an Matlab gesetzt (mxGetPr). Die Eigentliche Berechnung läuft in der Funktion rechnen(), sie ist natürlich vom zu lösenden Problem abhängig.<br />
Die C funktion wird mit dem Befehl <tt>mex funktionname.cc </tt> also in diesem Beispiel <tt>mex c_function.cc</tt> kompiliert.<br />
Es ist empfehlenswert Matlab mit dem Befehl <tt>matlab -check_malloc</tt> aus einem [[Terminal]] zu starten. Matlab überprüft dann automatisch ob ein pointer beim zugriff auf die "mex" Funktionen aus dem zugewiesenen speicher "rausläuft". <br />
<br><br><br />
Alle benötigten dateien für dieses Beispiel sind auf [http://itp.tugraz.at/~golubk_a/download/matlab_c/ matlab_c] zu finden.<br />
<br />
<pre><br />
<nowiki><br />
<br />
#include <mex.h><br />
#include <stdio.h><br />
#include <iostream><br />
#include <stddef.h><br />
#include <stdlib.h><br />
#include <math.h><br />
<br />
#include "nrutil.c"<br />
<br />
void rechnen(double **t,int m, int n, double a,int b, double *Obs1, double *Obs2);<br />
<br />
void mexFunction(int nlhs, mxArray *plhs[],<br />
int nrhs, const mxArray *prhs[])<br />
{<br />
<br />
double *t_m,a;<br />
int mrows,ncols,b;<br />
double **t;<br />
double *Obs1,*Obs2;<br />
<br />
<br />
/* Uebernehmen der Argumente die Matlab an diese C funktion uebergibt */<br />
<br />
/* Create a pointer to the input matrix y. */<br />
t_m = mxGetPr(prhs[0]); //pointer auf das feld t_m<br />
mrows = (int)mxGetM(prhs[0]); // anzahl der zeilen<br />
ncols = (int)mxGetN(prhs[0]); // anzahl der spalten<br />
<br />
/* Note: mxGetScalar returns a value, not a pointer. */<br />
a = (double)mxGetScalar(prhs[1]); // a als flieskommazahl uebergeben<br />
b = (int)mxGetScalar(prhs[2]); // b als integer<br />
<br />
<br />
/* Matlab ?bergibt die Matritzen als eindimensionale felder */<br />
/* Hier wird gezeigt, wie daraus wieder 2 dimensionale Arrays gemcht werden koennen*/<br />
<br />
t = dmatrix(0,mrows,0,ncols); // mit nrutils.c funktion speicher allocieren <br />
for(int i=0; i<mrows; i++)<br />
{<br />
for(int j=0; j<ncols; j++)<br />
{<br />
t[i][j] = (*(t_m + i + j * mrows));<br />
}<br />
}<br />
<br />
<br />
<br />
/* Matlab Ausgabe: Es werden zwei eindiemnsionale felder an Matlab zurueckgegeben */<br />
/* Set the output pointer to the output matrix. */<br />
plhs[0] = mxCreateDoubleMatrix(1,ncols, mxREAL); // erzeugt ein feld, in das geschrieben werden kann, mit der groesse mrows <br />
plhs[1] = mxCreateDoubleMatrix(1,ncols, mxREAL);<br />
<br />
/* Create a C pointer to a copy of the output matrix. */<br />
Obs1 = mxGetPr(plhs[0]); // erster rueckgabenwert an Matlab <br />
Obs2 = mxGetPr(plhs[1]); // zweiter rueckgabenwert an Matlab<br />
<br />
<br />
/* Berechnungen */<br />
rechnen(t,mrows,ncols,a,b,Obs1,Obs2); <br />
}<br />
<br />
<br />
<br />
// Hier wird die tatsaechliche berechnung gemacht<br />
void rechnen(double **t,int m, int n, double a,int b, double *Obs1, double *Obs2)<br />
{<br />
<br />
for(int j=0;j<n;j++) // alle spalten <br />
{<br />
Obs1[j] = 0;<br />
Obs2[j] = 0;<br />
for(int i=0;i<m;i++) //alle zeilen<br />
{<br />
Obs1[j] += t[i][j] ; //Summe der spalte <br />
Obs2[j] += t[i][j] / (double)b * a; //(Summe der spalte) / b * a<br />
// std::cout << t[i][j] <<'\n'; // moegliche testausgabe der werte<br />
<br />
}<br />
} <br />
}<br />
<br />
</nowiki><br />
</pre><br />
<br />
<br />
== Hier das aufrufende Matlab script: ==<br />
<br />
<br />
<pre><br />
<nowiki><br />
<br />
M = rand(2,10);<br />
a = 5.3;<br />
b = 2;<br />
<br />
<br />
<br />
<br />
[O,O2] = c_function(M,a,b); % <--- hier die C++ Funktion<br />
<br />
disp('Matrix');<br />
disp(M);<br />
disp('Summe der Spalten');<br />
disp(O);<br />
disp(['Summe der Spalten mit ',num2str(a), ' multimpliziert und mit ',num2str(b), ' dividiert']);<br />
disp(O2);<br />
<br />
<br />
<br />
</nowiki><br />
</pre></div>
129.27.157.23