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

Geschwindigkeitsoptimierung?

 

Sillicoid
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 13.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.04.2008, 22:58     Titel: Geschwindigkeitsoptimierung?
  Antworten mit Zitat      
Hi, im Anhang habe ich die vollständigen Quellcode von einem kleinen Matlab Programm angehängt was ich erstellt habe.
Im groben gehts darum, daß zu einer bzw. vielen später zufaellig eingegebenen Zahl (Telefonnummer) alle dazu möglichen Wortkombinationen die sich mit einer amerikanischen Handytastaturbeschriftung (0 = e; 1 = j,n,q usw) ergeben ausgegeben werden.
Weiterhin sollen auch alle Kombinationen erstellt werden indem eine der Ziffern in der Zahl ausgelassen wird.

Also z.b. aus 18098230 erhält man als möglcihe Ergebnisse:

'no ego rye'
'no 0 go rye'
'no 0 horde'
'no 0 horse'

Dazu bilde ich zunächst alle möglichen Kombinationen und vergleiche diese (bzw. Teile davon) dann mit dem String Array was meine Wortdatenbank enthält. Mehr möchte ich dazu erstmal garnicht beschreiben, denn wer mir Tipps zur Optimierung geben möchte muss sich eh den Quellcode anschauen Wink

Mir gehts darum, daß zur Zeit für eine einzige Eingabezahl von 8 Ziffern Matlab auf meinem Rechner (X2 4200) ganze 17 Sekunden benötigt um die Kombinationen zu berechen und ich die Vermutung habe das irgendwo in meinem Programm etwas stark ineffizient ist.
Falls also jemand die Zeit und Lust findet sich einmal durch meinen Code zu schlagen, würde ich mich sehr über Tipps zur Optimierung freuen.

Mfg

code.zip
 Beschreibung:

Download
 Dateiname:  code.zip
 Dateigröße:  133.33 KB
 Heruntergeladen:  1260 mal
Private Nachricht senden Benutzer-Profile anzeigen


slay
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 08.04.08
Wohnort: HH
Version: ---
     Beitrag Verfasst am: 14.04.2008, 13:40     Titel:
  Antworten mit Zitat      
Hi,

hab leider keine Zeit, mich durch den Code zu wühlen, aber als Anhaltspunkt:

hast du schonmal den Profiler bemüht? Also mit
Code:

vor Ausführung und
Code:
nach Ausführung... Damit hab ich eigentlich immer gute Optimierungen hinbekommen...
Private Nachricht senden Benutzer-Profile anzeigen
 
Sillicoid
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 13.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.04.2008, 14:16     Titel:
  Antworten mit Zitat      
Jo, hab ich gerade auch entdeckt.

Raus kommt dabei aber im Endeffekt nur das, was ich schon wusste. Die ganzen Vergleiche mit der langen Wortdatenbank kosten am meisten Zeit.
(vorallem da dort Matlab automatisch erstmal die komplette Wortliste versucht zu sortieren)

Mir ist auch bewusst, das für das gegebene Problem Matlab vermutlich eine sehr ungünstige Plattform ist, ich wollte aber einfach mal austesten wie schnell man sowas mit Matlab lösen kann und daher wärs nun interessant wie weit man die Rechenzeit noch drücken kann.

Es soll ja angeblich C++ Programme geben diese Aufgaben für 1000 Nummern auf einmal in ein paar Sekunden lösen, daher sieht mir 16 Sekunden für nur eine Zahl irgendwie komisch aus Smile

Vielleicht ist auch einfach mein Programm als ganzes ineffizient und gescheite Laufzeiten nur mit irgendwelchen Baumstrukturen für die Wortdatenbank zu erreichen Razz
Private Nachricht senden Benutzer-Profile anzeigen
 
Titus
Forum-Meister

Forum-Meister


Beiträge: 871
Anmeldedatum: 19.07.07
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 14.04.2008, 15:12     Titel:
  Antworten mit Zitat      
Hallo,
eine Möglichkeit, etwa 1/3 der Zeit zu sparen, ist die Funktion cutWord:
Du läufst durch das Array durch, und wenn eine Bedingung erfüllt ist, hängst Du das Wort an das Ende der Liste an.
Generell: erzeuge zunächst einen logischen Vector, z.B.
Code:
keepwords = false(size(wordlist));

Dann laufe durch die Schleife und setze
Code:
keep(i) = length(word)<=maxsize;

Anschließend ist
Code:
short_list = wordlist(keep);

das was Du suchst.
Hier allerdings geht es noch etwas besser (gar keine Schleife) mit Hilfe von cellfun:
Code:
keekword = cellfun(@length, wordlist) <=maxlength;
short_list = wordlist(keepword)';


Titus
Private Nachricht senden Benutzer-Profile anzeigen
 
Sillicoid
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 13.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.04.2008, 16:42     Titel:
  Antworten mit Zitat      
Yay, vielen Dank.

Durch den cellfun Befehl bei der Verkürzung der Wortliste konnte ich die Zeit schon auf 7 Sekunden pro Zahl reduzieren.

Jetzt werde ich mal schauen wo ich noch weitere Schleifen-Geschichten durch cellfun-Befehle ersetzen kann.

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