|
|
Matlab Befehl "sscanf" in MEX-Funktion implementie |
|
robertradar |

Forum-Fortgeschrittener
|
 |
Beiträge: 57
|
 |
|
 |
Anmeldedatum: 17.10.16
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 23.11.2016, 12:05
Titel: Matlab Befehl "sscanf" in MEX-Funktion implementie
|
 |
Hallo zusammen,
ich habe ein Problem bei der Erstellung einer mex-Funktion:
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
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.
|
|
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 23.11.2016, 18:12
Titel: Re: Matlab Befehl "sscanf" in MEX-Funktion impleme
|
 |
|
 |
|
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
|
|
|
robertradar |
Themenstarter

Forum-Fortgeschrittener
|
 |
Beiträge: 57
|
 |
|
 |
Anmeldedatum: 17.10.16
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 01.12.2016, 00:22
Titel:
|
 |
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?
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 01.12.2016, 14:39
Titel:
|
 |
|
 |
|
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
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
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
| 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.
|
|