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

Matlab Befehl "sscanf" in MEX-Funktion implementie

 

robertradar
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 17.10.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.11.2016, 12:05     Titel: Matlab Befehl "sscanf" in MEX-Funktion implementie
  Antworten mit Zitat      
Hallo zusammen,
ich habe ein Problem bei der Erstellung einer mex-Funktion:
Code:

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
mxArray *current_line;
mxChar *ptr_current_line;
int kommas[25] = {};  
current_line = mxDuplicateArray(prhs[0]);
ptr_current_line = (mxChar *)mxGetData(current_line);
% kommas ermitteln
% ...
% kommas beinhaltet jetzt die 25 “Positionen”, an denen in der current_line ein Komma steht.
}
 

current_line ist eine lange „Text-Zeile“, die viele Informationen unterschiedlicher Datentypen beinhaltet, die durch insgesamt 25 Kommata voneinander getrennt werden.
Ich möchte nun im Folgenden die Informationen zwischen 2 Kommata „auslesen“ (z.B. zwischen Komma #19 und Komma #20.
In Matlab habe ich das mit der Zeile
Code:

sscanf(current_line(kommas(19)+1:kommas(20)-1,i),'%f');
 

realisiert.
Das Problem ist, dass zwischen #19 und #20 z.B. „0.738586“ steht, was ich gerne im weiteren Verlauf als „double“ und nicht als „mxChar“ behandeln würde.
Kennt jemand eine Möglichkeit, wie ich in meiner mex-Funktion aus der current_line diese Information im richtigen Datentyp extrahieren kann?


Vielen Dank im Voraus.
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: 23.11.2016, 18:12     Titel: Re: Matlab Befehl "sscanf" in MEX-Funktion impleme
  Antworten mit Zitat      
Hallo robertradar,

Das geht auch in C mit sscanf fast genau wie in Matlab. Man liefert dann nicht einen String mit fester Länge, sondern einen Pointer auf den ersten Buchstaben und in C ist der String durch das abschließende 0-Zeichen begrenzt.

Allerdings sind solche String-Parser in Matlab einfacher zu realisieren, weil einem nicht gleich die ganze Matlab-Session um die Ohren fliegt, wenn man mal aus Versehen auf einen CHAR außerhalb der Strings zugreift. Solches String-Parsen ist im Allgemeinen auch nicht zeitkritisch. Deshalb würde ich das nach Möglichkeit in Matlab machen und erste die separierten Variablen als Inputs liefern.
Es gibt soo viel C-Code, der bei fehlerhaft implementierten String-Verarbeitungen Buffer-Überläufe produziert, dass man da nicht unbedingt ein weiteres Exemplar hinzufügen muss. Davon waren auch berühmte und wichtige Funktionen betroffen wie die Passwort-Eingabe beim Login von Linux oder etliche Lücken bei der Verarbeitung von Netzwerk-Paketen.
Ich schreibe sehr viele C-Mex-Scripte und bin immer heilfroh, wenn ich das String-Parsen in Matlab machen kann. Vielleicht läuft es dort 100 Mikrosekunden langsamer, dafür spare ich 4 Stunden Debug-Zeit.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 17.10.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.12.2016, 00:22     Titel:
  Antworten mit Zitat      
Hi Jan,

ich muss alle 80 ms etwa 4000 Strings parsen, die im Durschnitt eine Länge von 8 Characters haben. Macht es da wirklich keinen Sinn, das in Form eines C-MEX-Files zu beschleunigen?

Hast du einen Link zu einem Beispiel bzw. zur Doku, wo die von dir angesprochene Verwendung von sscanf erläutert wird?
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: 01.12.2016, 14:39     Titel:
  Antworten mit Zitat      
Hallo robertradar,
Zitat:
ich muss alle 80 ms etwa 4000 Strings parsen, die im Durschnitt eine Länge von 8 Characters haben.

Das ist eine Echt-Zeit-Anwendung, die Zahlen als Text verarbeitet? Schade, es wäre viel effizienter die Zahlen binär zu codieren, dann würde die gesamte Umwandlung einfach entfallen.

Das "mxDuplicateArray(prhs[0])" ist überflüssig und raubt nur Zeit. Solange Du den String nur ausliest, kannst Du direkt auf prhs[0] arbeiten.

Zitat:
Macht es da wirklich keinen Sinn, das in Form eines C-MEX-Files zu beschleunigen?

Woher weißt Du denn, dass es eine Beschleunigung ist? Der Aufruf einer MEX-Funktion hat einen Overhead und das Parsen mit SSCANF läuft auch in Matlab in einer Bibliothek, die in C geschrieben ist.

Zitat:
Hast du einen Link zu einem Beispiel bzw. zur Doku, wo die von dir angesprochene Verwendung von sscanf erläutert wird?

Meinst Du, ich soll jetzt Google nach "C sscanf" fragen und die Links hier posten? Mache das lieber selber, denn das geht schneller und Du kannst es gleich anklicken.


Wenn Du eine der Text-Zeilen postest und genau erklärst, welche Werte Du extrahieren möchtest, könnte man einen Matlab-Code vorschlagen und Du kannst ausprobieren, ob er in den 60ms läuft.

Gruß, Jan
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.