Verfasst am: 05.12.2016, 16:15
Titel: Ersetzen von regexp und regexprep
Hallo liebe Matlab Experten,
ich habe einen Code, der benutzt regexp und regexprep. Allerdings ist das sehr langsam (5-10 Sekunden). Da wollte ich mal nachfragen, ob es eine schnellere Alternative gibt?
Ich kenne die Funktionen strisplit, strfind, usw. Allerdings kenne ich bei diesem die Syntax nicht. Ich weiss zum Beispiel nicht, wie ich am Ende suche oder beliebig viele Leerzeichen, ....
Vielleicht könnt ihr mir weiterhelfen?
Ich benutze Matlab 2015a.
Mein Code sieht foldendermaßen aus:
Verfasst am: 05.12.2016, 16:36
Titel: Re: Ersetzen von regexp und regexprep
Hallo JackyJay,
Die Syntax von
strsplit
und
strfind
ist in der Dokumentation beschrieben: Entweder per "doc ..." oder hier im Forum auf den Namen der funktion klicken.
Regular Expressions sind sehr mächtig und das benötigt Rechenzeit.
strfind
sucht nur nach einer Zeichenkette ohne jegliche smarten Tricks. Jegliche Muster-Suchen muss man deshalb von Hand programmieren. Je nach dem ist das dann deutlich schneller als
regexp
.
Finde mal mit dem Profiler heraus. wo das Bottleneck des Codes liegt und poste den entsprechenden Befehl und erkläre, was er ganu tun soll.
danke für die schnelle Rückmeldung. Der Code ist mehrere hundert Zeilen lang. Über 90% der Zeit wird aber für die oben beschriebenen 6 Zeilen benötigt.
Die Dokumentation hilft mir in dem Zusammenhang leider nicht, da gewisse Befehle nicht beschrieben sind (wie zum Beispiel eine beliebige Leerzeichenkette entfernen).
lösche in inputData folgende Zeichenkette:
ein Zeilenumbruch, falls es einen gibt: \n?
gefolgt von { oder , oder }: [{,}]
gefolgt von beliebig vielen Leerzeichen: \s*
Und das alles muss am Ende von InputData stehen: $
Kann man das beispielsweise durch strrep ersetzen?
Die Dokumentation hilft mir in dem Zusammenhang leider nicht, da gewisse Befehle nicht beschrieben sind (wie zum Beispiel eine beliebige Leerzeichenkette entfernen).
Doch, natürlich hilft die Dokumentation genau hier weiter: Sie beschreibt natürlich alle möglichen Methoden. Und wenn von dem Entfernen beliebiger Zeichenketten nichts drin steht, dann geht es halt auch nicht. Dafür ist
strfind
also einfach nicht geeignet.
Kann man das beispielsweise durch strrep ersetzen?
Das ginge nur, indem man die ganzen anderen Kriterien manuell prgrammiert. Das ist umfangreich und fehlerträchtig, aber natürlich ist es möglich. Es gibt aber auf jeden Fall keine einfache Methode, um einen komplexen Regular-Expressions-Ausdruck mit einer einfachen und schnellen Low-Level-Funktion zu berechnen. Das wäre ja auch verblüffend.
Die Ursprungsfrage war ja, die Performance von regexp zu erhöhen. Vielleicht gibt es da noch andere Alternativen als strrep?
Mit Performanceverbesserung kenne ich mich leider nicht so aus in Matlab.
Wäre es denn möglich mit regexp verschiedene Befehle zu kombinieren? Ist das vielleicht schneller als mehrere hintereinanderzuschalten?
Na klar kann man das vielleicht kombinieren. Ich finde die regulaären Ausdrücke aber alles andere als übersichtlich und darum würde ich mir nicht zutrauen, die Bedeutung der 6 Code-Zeilen wirklich korrekt zusammenfassen zu können.
Vielleicht findet sich hier noch ein RegExp-Jongleur.
Die Datenmengen sind nicht sonderlich groß. Das Problem ist eher, dass ich die Funktion leider sehr oft anwenden muss. Das bringt die Zeit dann zum "Explodieren".
Ich habe ein paar Möglichkeiten gefunden einzelne Codezeilen zu verbessern mit strrep und strfind.
Was noch übrig bleibt sind folgende 2 Zeilen:
1. Ich habe einen String eingelesen aus einer Textdatei (inputData2). In dieser befinden sich verschiedene Zeilenumbrüche. Bei jedem Zeilenumbruch in der Textdatei möchte ich als Ergebnis in einem Output Cell Array (inputInfo) eine neue Zeile erstellen. Das mache ich bisher so:
2.
Ich möchte alle Leerzeichen am Anfang und am Ende eines Strings löschen (oder vom ganzen Cell array). inputInfo ist dabei ein Cell array aus strings.
dann sind deine Funktionen schon die schnelle Möglichkeit.
Du schreibst, dass du die Funktionen sehr oft aufrufen musst. Kann man das effizienter gestalten, indem man die Funktionen z.B. auf einen großen Textblock anwendet statt auf viele kleine?
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
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.