WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Probleme mit MEX Funktion

 

Tommy_Mensch
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 19.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2014, 14:04     Titel: Probleme mit MEX Funktion
  Antworten mit Zitat      
Hallo allerseits,
ich verzweifle hier gerade leicht an einer Mex Funktion! Mein Problem ist, ich habe wenig bis kaum Ahnung von C und in jedem Tutorial wird wild mit Pointern etc. rumgeschmissen... Daher dachte ich fragste hier mal recht freundlich nach.

Und zwar: Das Setup mit Compiler etc. hat alles funktioniert. Also ich habe es schon vollbracht die Hello World Funktion aufzurufen. Jetzt brauche ich aber eine MEX Funktion mit mehreren Ein- und Ausgängen.

Wäre da wohl jemand so freundlich mir das einmal an einem Beispiel von sagen wir 2 Ein- und Ausgängen zu erklären? Vllt. an einem Beispiel? Oder kennt jemand ein gutes Tutorial wo einfach gezeigt wird, 2 Variablen rein mit denen 2 rechnungen ausführen und 2 wieder raus?

Ich wäre für jede Hilfe Dankbar!

Beste Grüße,
Thomas
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.05.2014, 14:08     Titel:
  Antworten mit Zitat      
Hallo,

wie wäre dieses Beispiel?
http://www.mathworks.com/help/matla.....l/standalone-example.html
Grüße,
Harald

Zuletzt bearbeitet von Harald am 06.05.2014, 14:47, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Tommy_Mensch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 19.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2014, 14:17     Titel:
  Antworten mit Zitat      
Nicht so gut Wink

The page you were looking for is not available in this version of the Documentation. You can use the search box or browse the products below to find related information. You can also view archived documentation for prior releases.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.05.2014, 14:48     Titel:
  Antworten mit Zitat      
Hallo,

das ist merkwürdig. Versuchs mal mit dem angepassten Link oben.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Tommy_Mensch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 19.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2014, 14:59     Titel:
  Antworten mit Zitat      
Jetzt geht es, danke!

Ich schaue es mir mal an.

Mfg Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
Tommy_Mensch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 19.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2014, 15:10     Titel:
  Antworten mit Zitat      
Ok eine Frage schonmal: Diese ganzen Abfragen nach Spalten Datentyp der Eingansdaten ist optional oder?

Beste Grüße,
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.05.2014, 15:40     Titel:
  Antworten mit Zitat      
Hallo,

teils ja, teils nein. Du siehst ja, welche Informationen im weiteren Verlauf verwendet werden und welche nicht.

Die mxIs* - Befehle sind erst mal optional. Wenn dein C-Code allerdings infolge falschen Aufrufs intern irgendeinen Mist macht und du dich über die Ergebnisse wunderst, sind die aber gar nicht schlecht.

Die mxGet* - Befehle sind auch wichtig, wenn du dir z.B. Dimensionsinformationen holst. Du hast sonst ja nur einen Zeiger auf das Array, weißt aber nicht, wie groß es ist.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Tommy_Mensch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 19.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.05.2014, 10:04     Titel:
  Antworten mit Zitat      
OK vielen Dank schonmal. Die Abfragen sind für mich erstmal zweitrangig.
Ich bekomme das irgendwie nicht ans laufen. Diese ganze Pointergeschichte habe ich in der Inrormatikvorlesung immer gut umgangen und daher leider nie verstanden.

Sorry wenn ich mich etwas blöd anstelle, aber hat vllt. jemand eine MEX funktion auf dem Rechner , wo einfach von Matlab 2 sagen wir 2x1 Arrays übergeben werden, die Elemente mit 2 Multipliziert werden und wieder zurück gegeben werden?

Daran könnte ich mich dann entlang hangeln und mir wäre wirklich sehr geholfen...

Vielen Besten Dank im voraus!

Mfg
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.05.2014, 10:09     Titel:
  Antworten mit Zitat      
Hallo,

das Beispiel geht doch sehr in die Richtung?

Wenn du konkretisieren kannst, was du daran nicht verstehst...

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Tommy_Mensch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 19.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.05.2014, 12:44     Titel:
  Antworten mit Zitat      
Ok ich mache langsam Fortschritte!

Ich habe jetzt die folgende Funktion geschrieben die einen Wert übergibt, den verdoppelt und wieder ausgibt:

Code:

#include <mex.h>
#include <stdio.h>


void Funktion(double *y, double x)
{
   
    *y = 2.0 * x;
   
}


void mexFunction(int nlhs, mxArray *plhs[],
                 int nrhs, const mxArray *prhs[])
{
    double *y;
    double x;
   
    /* Erstellen der 1x1 Matrix des Outputs. */
    plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);

   
    /* Lesen des Inputs */
    x = mxGetScalar(prhs[0]);
   
    /* Pointer auf die Outputs. */
    y = mxGetPr(plhs[0]);
   
    /* Aufrufen der Computational Routine . */
    Funktion(y,x);
}

 


jetzt möchte ich unter anderem eine relativ große Matrix übergeben. Diese soll dann mit einer for Schleife Zeile für Zeile durchlaufen werden, diverse Rechnungen angestellt werden, die wiederum in einer Matrix gespeichert werden und diese Matrix wieder zurück gegeben werden.

Mein Hauptproblem liegt jetzt darin eine Matrix zu übergeben...
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.05.2014, 17:46     Titel:
  Antworten mit Zitat      
Hallo,

im Grunde brauchst du nur den Schritten im Beispiel folgen:

statt mxGetScalar-Befehl
Code:
x = mxGetPr(prhs[0]);
% pointer auf die Originalmatrix

mxGetM und mxGetN verwenden, um die Dimensionen der Originalmatrix herauszufinden.

Mit mxCreateDoubleMatrix die Output-Matrix allokieren.

Funktion aufrufen.

An sich kannst du das direkt aus dem geposteten Beispiel übernehmen. Was anderes mache ich gerade auch nicht ;)

Warum tust du dir die mex-Geschichte eigentlich an?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Tommy_Mensch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 19.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.05.2014, 12:22     Titel:
  Antworten mit Zitat      
Sonst nehme ich einfach Spaltenvektoren und setze sie danach wieder zusammen...
Weil die Strapdownrechnung in Matlab für längere Flüge sonst zu lange dauert!
Vielen Dank aber für deine Hilfe ich tüftel dann mal weiter Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.05.2014, 18:07     Titel:
  Antworten mit Zitat      
Hallo,

C-Code ist in der Tat schneller als gleichwertiger MATLAB-Code. Es ist jedoch in MATLAB wesentlich einfacher, effizienten Code zu schreiben.

Ich würde also tendentiell zunächst versuchen, den MATLAB-Code zu optimieren, beispielsweise for-Schleifen vermeiden und stattdessen Vektor- oder Matrixoperationen verwenden.
Du kannst mit dem Profiler überprüfen, welche Teile deines Codes die meiste Zeit verbrauchen. Dann diesen Teil optimieren (und ggf. die Leute hier dazu um Rat fragen).

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.