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

Ersetzen von regexp und regexprep

 

JackyJay
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 04.04.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.12.2016, 16:15     Titel: Ersetzen von regexp und regexprep
  Antworten mit Zitat      
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:

Code:
inputData 2=regexprep(inputData,'\n?[{,}]\s*$','');
inputData 2=regexprep(inputData 2,'^.*\$SomeText|}.*$','$SomeText');
inputInfo=regexp(inputData2,'\n','split')';

outputData1=regexprep(inputInfo{1},'.*\$SomeText *\s','');
outputData_num=regexp(outputData1,'\D','once');

outputData2=regexprep(inputInfo{2},'^\s*|*\s$','');
 


Vielen Dank im Voraus.

[EDITED, Jan, Bitte Code-Umgebung verwenden - Danke!]
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: 05.12.2016, 16:36     Titel: Re: Ersetzen von regexp und regexprep
  Antworten mit Zitat      
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.

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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 04.04.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.12.2016, 17:57     Titel:
  Antworten mit Zitat      
Hallo,

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).

Beispiel für die erste Zeile:
Code:
inputData 2=regexprep(inputData,'\n?[{,}]\s*$','');


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?
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: 06.12.2016, 12:38     Titel:
  Antworten mit Zitat      
Hallo JackyJay,

Zitat:
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.

Zitat:
Code:
inputData 2=regexprep(inputData,'\n?[{,}]\s*$','');

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.

Viele Grüße, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
JackyJay
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 04.04.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.12.2016, 15:33     Titel:
  Antworten mit Zitat      
Okay. Also ist strrep keine gute Idee...

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?
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: 06.12.2016, 20:38     Titel:
  Antworten mit Zitat      
Hallo JackyJay,

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.

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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 04.04.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.12.2016, 14:34     Titel:
  Antworten mit Zitat      
Trotzdem danke für deine Hilfe. Smile

Dann hoffe ich mal, das sich noch jemand meldet.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.12.2016, 14:50     Titel:
  Antworten mit Zitat      
Hallo,

wie groß sind denn die Datenmengen, auf die das angewendet wird?

Ein Umstieg auf ein neueres Release könnte helfen:
https://de.mathworks.com/products/m.....lab-execution-engine.html
Ob das auch deinen Code beschleunigt, wird auf den Versuch ankommen.

Grüße,
Harald

P.S.: Sind 5-10 Sekunden "sehr langsam"? Bei manchen Leuten laufen Berechnungen Wochen lang...
Private Nachricht senden Benutzer-Profile anzeigen
 
JackyJay
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 04.04.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.12.2016, 16:46     Titel:
  Antworten mit Zitat      
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:

Code:
inputInfo=regexp(inputData2,'\n','split')';


Gibt es dazu eine schnellere Alternative?


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.

Bei einem String mache ich das bisher so:
Code:
outputData2=regexprep(inputInfo{2},'^\s*|*\s$','');


Beim ganzen Cell array so:
Code:
outputData2=regexprep(inputInfo,'^\s*|*\s$','');


Gibt es da etwas schnelleres?

Ich versuche auch mal den neuen Release aus.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.12.2016, 16:52     Titel:
  Antworten mit Zitat      
Hallo,

alternative Funktionen
zu 1.:
strsplit

zu 2.:
strtrim (eingeführt in R2016a)

Ob diese Funktionen schneller sind, müsstest du ausprobieren.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
JackyJay
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 04.04.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.12.2016, 17:36     Titel:
  Antworten mit Zitat      
Hallo,

danke für deine Rückmeldung.
Leider sind beide Funktionen deutlich langsamer (Faktor 2-4).
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.12.2016, 18:00     Titel:
  Antworten mit Zitat      
Hallo,

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?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
JackyJay
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 04.04.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.12.2016, 11:25     Titel:
  Antworten mit Zitat      
Das hört sich nach einer sehr guten Idee an. Smile

Muss ich gleich mal testen!
Vielen Dank!
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 - 2024 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.