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

entfernen leerer zellen (performance)

 

Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.12.2014, 12:41     Titel: entfernen leerer zellen (performance)
  Antworten mit Zitat      
Hallo,

ich habe einen Flaschenhals in meinem Programm entdeckt. Um einen Schleifendurchlauf zu beschleunigen suche ich in einem Cellarray die leeren Felder (sind immer die letzten) und entferne diese. Aber das entfernen dauert sehr lange, da die Funktion zwischen 10000 und 200000 mal aufgerufen wird. Beispielhaft habe ich mal einen Code geschrieben der das Problem verdeutlichen soll. Dabei ist die Zeile 7 diejenige die mit Abstand am langsamsten ist. Gibt es einen Befehl oder eine bessere Möglichkeit die gefundenen leeren Zellen zu löschen?

Code:
testarray = cell(1,50000);
testarray{1} = 'test';
testarray{50} = 'test';
for i=1:50000
newarray = testarray;
emptycells = cellfun('isempty', newarray);
newarray(emptycells) = []; % this is slow
end
 


Vito
Forum-Guru

Forum-Guru


Beiträge: 315
Anmeldedatum: 02.11.09
Wohnort: Stuttgart
Version: ---
     Beitrag Verfasst am: 08.12.2014, 12:53     Titel:
  Antworten mit Zitat      
Hi,

so geht das
Code:

Leere = cellfun(@isempty, testarray);
testarray(Leere)=[]
 

Warum lässt du es über eine Schleife laufen?


MfG,
Vito
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.12.2014, 13:06     Titel:
  Antworten mit Zitat      
Hallo Vito,

die Schleife ist natürlich unnötig. Habe ich nur eingebaut und zu verdeutlichen wie langsam das ganze ist. Dein Befehlt cellfun(@isemtpy, testarray) ist übrigends viele male langsamer als cellfun('isempty', testarray) Wink
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.12.2014, 14:48     Titel:
  Antworten mit Zitat      
Nach ein wenig experementieren habe ich es geschafft minimal schneller zu machen:
Code:
testarray = cell(1,50000);
testarray{1} = 'test';
testarray{50} = 'test';
newarray = testarray;
tic
for i=1:10000
newarray = testarray;
emptycells = cellfun('isempty', newarray);
newarray(emptycells) = []; % this is slow
end
toc % Elapsed time is 7.471998 seconds
tic
for i=1:10000
newarray = testarray;
emptycells = cellfun('isempty', newarray);
firstempty = find(emptycells, 1, 'first');
newarray(firstempty:end) = []; % little bit faster
end
toc % needed time is 7.120380 seconds
 


Hat jemand noch eine schnellere Lösung?
P.S. die Schleife ist nur zur "Simulation" der Funktionsaufrufe da, sonst wäre der unterschied nicht mehr messbar
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.12.2014, 15:06     Titel:
  Antworten mit Zitat      
vergesst den letzten Post. beide methoden sind exakt gleich schnell (bei der zweiten wurde Eintrag 50 ignoriert, bei meinem array sind aber zb die Einträge 1 bis 50 belegt, erste danach sind alle leer)
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.12.2014, 10:00     Titel:
  Antworten mit Zitat      
kennt keiner eine möglichkeit das schneller zu machen? Sad
 
Alex4456
Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 17.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.12.2014, 10:06     Titel:
  Antworten mit Zitat      
Hallo

Welchen Grund hat es, das CellArray leer zu machen?

Speicher in einem logical Vektor welche Zellen leer sind und arbeite nicht mit diesen? Wäre das eine Möglichkeit? Sollte schneller gehen

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.12.2014, 14:37     Titel:
  Antworten mit Zitat      
Alex4456 hat Folgendes geschrieben:
Hallo

Welchen Grund hat es, das CellArray leer zu machen?

Speicher in einem logical Vektor welche Zellen leer sind und arbeite nicht mit diesen? Wäre das eine Möglichkeit? Sollte schneller gehen

Grüße

Very Happy
Damit hast du mich auf eine Idee gebracht. Ich entferne die leeren CellArrays damit diese nicht in einer Schleife mitlaufen. Aber mit dem Befehl
Code:
lastempty = find(~emptycells, 1, 'last');
kann ich das natürlich umgehen. (Die Schleife geht vom letzten Eintrag bis zum ersten falls nötig) Läuft jetzt viele Male schneller Smile Merci
 
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.