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

mex-Datei Absturz -> Problem mit Variablen/Pointern?

 

Zuschauer

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.09.2014, 15:00     Titel: mex-Datei Absturz -> Problem mit Variablen/Pointern?
  Antworten mit Zitat      
Hallo!

Ich versuche seit Tagen einen mex-File (stabil) zum Laufen zu bekommen. Ich brauche für meinen Algorithmus eine Index-Menge die leider nicht-linear ist. Um das ganze zu verschnellern wollte ich die Berechnung in eine mex-Datei auslagern. Rechnerisch scheint der Algorithmus richtig zu sein, da er in vielen Fällen durchläuft und das richtige Ergebnis liefert. Allerdings scheint irgendwo der Wurm drin zu sein, denn bei bestimmten Eingabeparametern stürzt Matlab einfach ab (keine Fehlermeldung, garnichts, einfach keine Reaktion mehr).

Hier mal der Code aufs wesentliche reduziert:

Code:

#include "mex.h"
#include "math.h"

void mexFunction(int nlhs, mxArray *plhs[],
                 int nrhs, const mxArray *prhs[])
{

    double* cSize = mxGetPr(prhs[0]);;
    double Index = mxGetScalar(prhs[1]);
   
    /* umrechnen in 2-dim Indexierung */
    int indCol = (int)(ceil(Index/cSize[0]-0.0001));
    int indRow = (int)(Index - (indCol-1)*cSize[0]);
    int numInd = 0;
   
    plhs[0] = mxCreateDoubleMatrix(45*cSize[1],1,mxREAL);
    double* outMatrix = mxGetPr(plhs[0]);

    int firstY;
    int lastY;

    /* durchlaufen bestimmter Spalten */
    for(int k=(int)(fmax(1,indCol-indRow-40)); k<=(int)(fmin(cSize[1],indCol+indRow+40)); k++) {
       
        /* durchlaufen bestimmter Zeilen (abhängig von der Spalte) */
        firstY = (int)(ceil(sqrt(fmax(1,indRow*indRow - (k-indCol)*(k-indCol)))));
        lastY = (int)(floor(sqrt(fmin(cSize[0]*cSize[0],(indRow+40)*(indRow+40) - (k-indCol)*(k-indCol)))));

        if( firstY>lastY ) continue;
       
        for(int j=firstY;   j<=lastY;   j++) {
 
            outMatrix[numInd] = cSize[0]*(k-1)+j;
            numInd++;
           
        }
       
    }
   
    /* Output schneiden */
    mxSetM(plhs[0],(mwSize)(numInd-1));
   
}
 


Die Funktion erhält als Eingabeparameter eine 2x1 Matrix (Größe einer Matrix meines Algorithmus) und einen Index dieser Matrix (1-dimensionale Indexierung). Als Ausgabe erhält man alle Indizes die auf einem bestimmten Kreisring liegen. In der mex-Datei werden dafür einfach 2 for-Schleifen durchlaufen und der Index nach und nach in "outMatrix" eingetragen. Der vorher für den Output angelegte Speicherplatz hat Platz für 45*cSize[1] Einträge was eine obere Schranke für den benötigten Platz ist. Gegen Ende werden die überschüssigen Einträge entfernt.

Als funktionierendes Beispiel kann einfach mal dieser Code ausgeführt werden:
Code:

index=pipe([100,300],100*150+50);
a=zeros(100,300);
a(index)=1;
imagesc(a); colormap(gray);
 


Startet man aber statt dessen diesen Code:

Code:

index=pipe([190,40],25);
 


stürzt bei mir das Programm ohne jegliche Warnung ab. Ich vermute das es an irgendeinem Pointer-Problem liegt oder evtl. an der Unverträglichkeit der Matlab-Variablentypen (mx...) mit den nativen C-Typen (double, int...). Hab aber jetzt schon ewig herumprobiert und konnte das Ganze noch nicht zum laufen bringen. Ich hoffe hier kann mir jemand weiterhelfen.

Vielen Dank schonmal fürs bis hierhin lesen Smile


Zuschauer

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.09.2014, 18:53     Titel:
  Antworten mit Zitat      
Ok, hat sich erledigt -.-

Die obere Schranke für die Elemente gilt erst, wenn die Matrizen entsprechend groß sind (was bei meiner Anwendung zutrifft aber bei Minimalbeispielen natürlich nicht mehr). Tja, da hät ich auch eher drauf kommen können.
 
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.