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 Datenausgabe

 

Achi
Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 29.10.2010, 09:51     Titel: mex Datenausgabe
  Antworten mit Zitat      
Ich hab in meinem Mexfile verschieden Abbruchbedingungen.

Code:

 if (xArray[n]<=0 ||
                   yArray[n]<=0 ||
                   xArray[n]>=maxsensorradius*2 ||
                   yArray[n]>=maxsensorradius*2 ||
                   isnan(xArray[n]) ||
                   isnan(yArray[n]))
                   {break;}

 

Nur mit diesen werden die berechneten Werte ausgegeben.
Füge ich aber eine weitere ein:
Code:

if (winkel>0)
 {break;}
 

bekomme ich keine Ausgabeparameter mehr zurück???


Der Speicher wurde so angelegt:

Code:

           xArray=mxMalloc(speichervorgabe*sizeof(double));
           yArray=mxMalloc(speichervorgabe*sizeof(double));

und dann mit
    /* Speicher für Ergebnis vorbelegen */
           plhs[0]=mxCreateDoubleMatrix(1,n-1,mxREAL);
           plhs[1]=mxCreateDoubleMatrix(1,n-1,mxREAL);
     
 
          /* Daten in Ausgabe kopieren */
          memcpy(mxGetPr(plhs[0]),xArray,(n-1)*sizeof(double));
          memcpy(mxGetPr(plhs[1]),yArray,(n-1)*sizeof(double));  
 

zum Ausgang kopiert. WOran liegt es, dass die berechneten Werte nicht ausgegeben werden?

DANKE
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 29.10.2010, 10:43     Titel: Re: mex Datenausgabe
  Antworten mit Zitat      
Hallo Achi,

Es ist aus den Code-Ausschnitten nicht zu sehen, auf welche Schleife die beiden BREAKS wirken.

Zitat:
Nur mit diesen werden die berechneten Werte ausgegeben.

Das verstehe ich nicht. Mit welchen werden Werte ausgegeben?

Zitat:
zum Ausgang kopiert.

???

So weit ich das sehe, kann die Funktion Deines Programm aus den gezeigten Zeilen nicht vollständig erschlossen werden. Deswegen wird es nicht möglich sein, so das Problem zu finden. Bitte poste den ganzen relevanten Code.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Achi
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 29.10.2010, 10:52     Titel:
  Antworten mit Zitat      
Hallo Jan,

ich denke, das sollte reichen:
Code:


              /* Reflexion 1.Ordnung */
                   
            pointerwink=&Winkelmatrix[0];
           
              for(m=0;m<=100000;m++){
//                     mexPrintf("m= %i \n  ",m);  
//-------------------------------------------------------------------------            
    xArrayReflex[m]=floor((xArray[n]+m*Step*-sind(reflexionswinkel))+0.5); // floor((...)+0.5): round                                                                    
    yArrayReflex[m]=floor((yArray[n]+m*Step* cosd(reflexionswinkel))+0.5);                      
//-------------------------------------------------------------------------                          
              linearerind[m]=xArrayReflex[m]*matrixgroesse+yArrayReflex[m];
              wink[m]=*(pointerwink+linearerind[m]);      
//          mexPrintf("aktueller WinkelaufMAtrix %f  \n",wink[m]);
             
       
//-------------------------------------------------------------------------              
               /*Abbruchbedingungen der Berechnungen*/
               if (xArrayReflex[m]<=0 ||
                   yArrayReflex[m]<=0 ||
                   xArrayReflex[m]>=maxsensorradius*2 ||
                   yArrayReflex[m]>=maxsensorradius*2 ||
                   isnan(xArrayReflex[m]) ||
                   isnan(yArrayReflex[m]))
                   {break;}
//                if  (wink[m]!=0)      
//                      {break;}
             
//               mexPrintf(" xReflex= %g yReflex= %g  \n",xArrayReflex[m],yArrayReflex[m]);
             
              if (m==speichervorgabe) {
               
               speichervorgabe*=2; // Doppelte Länge
           
       xArrayReflex=mxRealloc(xArrayReflex,speichervorgabe*sizeof(double));
       yArrayReflex=mxRealloc(yArrayReflex,speichervorgabe*sizeof(double));
       linearerind=mxRealloc(linearerind,speichervorgabe*sizeof(int));
           
                                       }    
              if (m>0){
               plhs[2]=mxCreateDoubleMatrix(1,m-1,mxREAL);
               plhs[3]=mxCreateDoubleMatrix(1,m-1,mxREAL);
               
          memcpy(mxGetPr(plhs[2]),xArrayReflex,(m-1)*sizeof(double));
          memcpy(mxGetPr(plhs[3]),yArrayReflex,(m-1)*sizeof(double));
                     }
                                   }
           

Ich denke zusammen mit der vorherigen Info ist es jetzt erschließbar.
Bricht mir die Schleife durch:

Code:

 if (xArrayReflex[m]<=0 ||
                   yArrayReflex[m]<=0 ||
                   xArrayReflex[m]>=maxsensorradius*2 ||
                   yArrayReflex[m]>=maxsensorradius*2 ||
                   isnan(xArrayReflex[m]) ||
                   isnan(yArrayReflex[m]))
                   {break;}


ab.
Wird brav der xArray und yArray ausgegeben. Füge ich die ander Bedingung ein:

if (wink[m]!=0) {break;}
Gibts es keinen Autoput mehr?

DANKE
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 29.10.2010, 11:01     Titel:
  Antworten mit Zitat      
Hallo Achi,

Ich fasse den Code mal auf's Wesentliche zusammen:
Code:

for(m = 0; m <= 100000; m++) {
  if (xArrayReflex[m] <= 0 ||
      yArrayReflex[m] <= 0 ||
      xArrayReflex[m] >= maxsensorradius*2 ||
      yArrayReflex[m] >= maxsensorradius*2 ||
      isnan(xArrayReflex[m]) ||
      isnan(yArrayReflex[m]))
        {break;}
   if (wink[m] != 0)      
        {break;}
   if (m>0) {
        plhs[2] = mxCreateDoubleMatrix(1, m-1, mxREAL);
        plhs[3] = mxCreateDoubleMatrix(1, m-1, mxREAL);
   }
}

Die Ausgabe des 3. und 4. Outputs wird nur dann definiert, wenn "wink[m] != 0" logisch falsch ist. Wenn "wink[m]" also ungleich Null ist, wird das mxCreateDoubleMatrix gar nicht erreicht, da ja bereits vorher die FOR-Schleife per "break" verlassen wird.

Hast Du etwas anderes erwartet?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Achi
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 29.10.2010, 11:12     Titel:
  Antworten mit Zitat      
Ups Danke Laughing

Code:

 if (wink[m]==0)      
                     {continue;}
              if (xArrayReflex[m]<=0 ||
                   yArrayReflex[m]<=0 ||
                   xArrayReflex[m]>=maxsensorradius*2 ||
                   yArrayReflex[m]>=maxsensorradius*2 ||
                   isnan(xArrayReflex[m]) ||
                   isnan(yArrayReflex[m]))
                   {break;}
...
 

SO jetzt gehts!!!!
Vielen DANK
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Achi
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 29.10.2010, 11:23     Titel:
  Antworten mit Zitat      
Ne leider doch nicht, so schmiert es mir einfach ab...
Ich will aber die Schleife verlassen und die Werte bis
wink[m]!=0 erriecht wurde ausgeben lassen.
Was muss ich da ändern?
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 29.10.2010, 13:37     Titel:
  Antworten mit Zitat      
Hallo Achi!

Zitat:
Ich will aber die Schleife verlassen und die Werte bis
wink[m]!=0 erriecht wurde ausgeben lassen.

"Erriecht"? Vielleicht liegt's an Deiner Nase? ;-)

Wie wäre es, wenn Du die plhs[2] und plhs[3] nach der Schleife erzeugst? Dann müssetst Du noch berücksichtigen, dass eventuell kein einizger Wert gefunden wurde.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Achi
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 29.10.2010, 14:21     Titel:
  Antworten mit Zitat      
Ich halte sehr viel davon, weils jetzt wirklich funktioniert.
Hab ich gut "errochen" Rolling Eyes Laughing
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Achi
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 29.10.2010, 14:25     Titel:
  Antworten mit Zitat      
Und wie berücksichtige ich jetzt, dass evtl kein einziger Wert
erzeugt wird?
Das file hat 4 Ausgabeparameter, 2 davon entstehen immer.
Die beiden letzt genannten nicht immer.
Im m-file bekomme ich das meiner Meinung nach mit

Code:

in den Griff. Aber im mex-File????
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Achi
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 29.10.2010, 14:58     Titel:
  Antworten mit Zitat      
Falsch im m-File bräuchte ich wohl:

varargout, aber im mex-File??
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 29.10.2010, 15:36     Titel:
  Antworten mit Zitat      
Hallo Achi,

Code:

if (m>0) {  // Sollte es m > 1 sein?
   plhs[2] = mxCreateDoubleMatrix(1, m-1, mxREAL);
   plhs[3] = mxCreateDoubleMatrix(1, m-1, mxREAL);
   // Und Werte kopieren
} else {
   plhs[2] = mxCreateDoubleMatrix(0, 0, mxREAL);
   plhs[3] = mxCreateDoubleMatrix(0, 0, mxREAL);
}
 

Also leere Matrix zurückliefern, wenn nichts gefunden wurde - siehe "find(1:10 == 0)".
Wenn m==1, liefert "mxCreateDoubleMatrix(1, m-1, mxREAL)" eine leere [1 x 0] Matrix -- ist das gewollt?

NARGOUT entspricht übrigens der C-Mex Variablen "nlhs".
"varargout(1:nargout)" zu belegen ist damit das gleiche wie "plhs[0]" bis "plhs[nlhs-1]" zu belegen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 29.10.2010, 15:41     Titel:
  Antworten mit Zitat      
Hallo Achi,

ich habe noch einen Kommentar:
Code:

for(m=0;m<=100000;m++) {
  if (m>0){
     plhs[2]=mxCreateDoubleMatrix(1, m-1, mxREAL);
     plhs[3]=mxCreateDoubleMatrix(1, m-1, mxREAL);
  }
}

Es sieht so aus, als hättest Du plhs[2] und plhs[3] mehrfach erzeugt - stimmt das? Das wäre ein Memory-Leak, da die alten mxArrays nicht wieder freigegeben wurden. Zudem wäre die equivalent zum nicht-pre-allocierten Belegen von Arrays in Matlab.

mxCreateDoubleMatrix am Schluß zu aufzurufen löst dieses Problem aber automatisch mit auf.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Achi
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 30.10.2010, 16:47     Titel:
  Antworten mit Zitat      
Hallo Jan:

Wenn m==1, liefert "mxCreateDoubleMatrix(1, m-1, mxREAL)" eine leere [1 x 0] Matrix -- ist das gewollt?

Nein, das war nicht gewollt und wurde von mir übersehen. Vielen DANK
Zum 2.ten:
Ja es kann sein, dass diese Werte mehrfach erzeugt werden und ich sie dann überschreibe, das wäre das letzte in diesem File was gelöst werden muss.

DANKE
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
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.