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

C-Files in Matlab einbinden: Array zurückgeben

 

AndiTouzani
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 23.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.05.2008, 17:51     Titel: C-Files in Matlab einbinden: Array zurückgeben
  Antworten mit Zitat      
Hallo zusammen,

ich habe bei dem Versuch ein C-File mit mex in Matlab einzubinden ein paar Probleme. Durch diverse Beispiele hab ich es zwar schon geschafft und ich denke, dass ich auch die Logik mit den Parametern in mexFunction einigermaßen verstanden habe. Aber in allen Beispielen, die ich gesehen habe, sind die Variablen oder Arrays auf den Datentyp double ausgelegt. Da später das Ziel ist Mikrocontroller-Software mit Matlab zu testen, ist es relativ schlecht mit double-Variablen zu arbeiten. Daher mein Ziel: Ein uint8-Array wird in ein C-File gegeben, dort wird irgendwas gerechnet und ein uint8-Array soll zurückgegeben werden.

Den ersten Teil, sprich die Übergabe in die C-Funktion, hat geklappt. Allerdings habe ich noch Probleme mit der Rückgabe.

Angelehnt an die Beispiele habe ich gedacht, dass ich einfach ein Array erstelle mit:
plhs[0] = mxCreateNumericMatrix(1,columns,mxUINT8_CLASS_mxREAL);
und der Pointer von diesen Matlab-Daten auf mein Ausgabearray zeigt:
outMatrix = (int*) mxGetPr(plhs[0]);

Nachdem ich die Zeiger wie oben gecastet habe, zeigt mir der Compiler auch keine Fehler oder Warnungen mehr an, aber lustigerweise wird nur das erste Element des Arrays richtig angezeigt.

In meinem kleinen Programmen wird beispielsweise jedes Element des Eingangsarray mit einem übergebenen Faktor multipliziert. Als Beispiel bekomme ich aber sowas heraus:

multi = uint8(5);
array = uint8([1,3,5]);
erg = arrayProduct(multi,array)
erg =
5 0 0

Kann es sein, dass durch das Casten die Probleme entstehen? Ich bin etwas ratlos, wäre super wenn jemand einen Vorschlag machen könnte. Bei Bedarf kann ich natürlich gerne noch den kompletten Quellcode posten.

In Hoffnung auf Hilfe Smile
Andreas
Private Nachricht senden Benutzer-Profile anzeigen


luiscantero
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 07.03.09
Wohnort: München
Version: ---
     Beitrag Verfasst am: 04.09.2009, 13:18     Titel:
  Antworten mit Zitat      
Hallo,
eventuell hilft folgendes Beispiel:
Code:

// Name: uint32test.cpp
// Compile: mex uint32test.cpp
// Test: uint32test

#include "mex.h"
#include <stdio.h>
#include <stdlib.h>
#include <vector>

#define printf mexPrintf

/* Output Arguments */
#define   MY_OUT      plhs[0]
#define MY_SIZE      10
typedef unsigned int MY_TYPE; // Define data type (should match MATLAB type, e. g. mxUINT32_CLASS).

using std::vector; // C++.

// MEX-gateway routine.
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
    vector<MY_TYPE> testVector;
    testVector.reserve(MY_SIZE);
   
    // Fill test vector with numbers.
    MY_TYPE tempCounter = 0; // 0 to MY_SIZE.
    for (tempCounter = 0; tempCounter < MY_SIZE; ++tempCounter) {
        testVector.push_back(tempCounter);
    }
   
    // Create uint32 matrix of dimensions tempCounter * 4.
    MY_OUT = mxCreateNumericMatrix((mwSize) tempCounter, (mwSize) 4, mxUINT32_CLASS, mxREAL);
   
    // Use memcpy to fill the matrix instead of using a loop.
    MY_TYPE * ptr_OUT = (MY_TYPE *) mxGetPr(MY_OUT);
    // Each column is filled separately, but the whole matrix could also be filled at once,
    // if the copied data has the same size as the matrix.
    memcpy(&ptr_OUT[0], &testVector[0], tempCounter * sizeof(MY_TYPE)); // Column 1.
    memcpy(&ptr_OUT[tempCounter], &testVector[0], tempCounter * sizeof(MY_TYPE)); // Column 2.
    memcpy(&ptr_OUT[2 * tempCounter], &testVector[0], tempCounter * sizeof(MY_TYPE)); // Column 3.
    memcpy(&ptr_OUT[3 * tempCounter], &testVector[0], tempCounter * sizeof(MY_TYPE)); // Column 4.
   
    return;
}

 


Gruß Luis
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 - 2024 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.