Verfasst am: 01.03.2013, 15:48
Titel: dlmwrite oder lieber xlswrite
Hallo Ich hab da mal eine Frage
Ich hab mir ein kleines Programm gebastelt und mit Hilfe dieses Froums beschleunigt)
Am Ende meines kleinen Programmes möchte ich gerne meine Daten Speichern.
Jetzt hab ich 2 Probleme.
1. bei meiner jetzigen Version kann ich leider nur Matrizen Speichern ohne Köpfe
2. Ich könnte auf xlswrite zurückgreifen und mir die Köpfe selber schreiben xlswrite ist aber wesentlich langsamer.
Als anhaltspunkte:
dlmwrite benötigt für 10 Dateien ca. 78 sec.
xlsxwrite benötigt für 10 Dateien ca. 100 sec.
was würdet Ihr mir denn empfehlen zu machen??
Ich muss mehrere 100 Dateien bearbeiten weshalb die wenigen Sec. schon viel ausmachen
Naja der Vorteil ist bei xls write bekomm ich die köpfe selber hin...
Ich möchte gerne in den Köpfen die Tabellenköpfe meinert Angehängten Datei haben. und Natürlich erweitert um die Sachen die ich berechne.
Ich häng einfach mal mein komplettes Skript an.
LG Florre
Code:
closeall %1. und2. Zeile zum löschen des Speichers
dateien=uigetdir('',link); %Verzeichnis der Dateien durch eingabe des Benutzer bekommen
cd(dateien); %Dateien Auslesen
[stat,Text]=fileattrib('*.txt'); %Die Attribute der Dateien Auslesen die meisten sind Sinnlos und leer
names={Text.Name}; %Die Namen der Dateien in eine "Tabelle" speichern wichtig für die Auswertung
x=1; %Laufparameter für nachfolgende Schleife
while(1)
File=names{x}; %Dateien einzeln nehmen
comma2point(File) %extra Funktion aus dem I-net gefischt und verändert Ersetzt die Kommas durch Punkte MATLAB braucht Punkte
Einlesen=dlmread(File,'\t',8,0); %Da die Dateien Einen Text Kopf und auch die Spalten Text enthalten und MATLAB nicht viel damit anfagen kann werden sie Rausgefilter (Nicht eingelesen)
Einlesen(:,4)=Einlesen(:,4).*1000;
Einlesen(:,6)=Einlesen(:,2).*Einlesen(:,3);
Einlesen(:,7)=Einlesen(:,4).*Einlesen(:,5);
dlmwrite kennt '-append' um etwas an eine Datei anzuhängen. Du kannst also den Header schon vorher schreiben/kopieren und danach die Daten schreiben.
Oder Du benutzt gleich nur fprintf zum Schreiben.
das mit dem -append war mir bewust nur ich hab das nicht hinbekommen das er mir die beiden Kopfzeilen der Tabelle kopiert...
das ist ja eigentlich meine Frage...
wie bekomm ich es hin das er mir Nur die beiden Kopfzeilen kopiert ohne das davor und ohne das danach...
das mit fprintf ist mir irgendwie zu hoch hatte damit auch mal rumhantiert kam aber nie auf irgendwas sinnvolles....
vlt. stell ich mich auch einfach zublöd an...
Die FOR-Schleife ist deutlich einfach zu debuggen, aber die vektorisierte Methode ist hier wahrscheinlich noch schneller, und noch etwas eleganter und effizienter als die FOR-Schleife. Aber dennoch wird sich an der gesamten Laufzeit kaum etwas ändern, da beim Schreiben auf die langsame Festplatte die meiste Zeit verbraucht wird.
Bedenke: Die Gesamt-Zeit, die ein Programm zur Lösung eines Problems benötigt ist:
Weil man z.B. im Studium meist nur sehr handliche Programme schreibt, ist der sinnvolle Einsatz der Designzeit bei vielen Anfängern praktisch unbekannt und auch größere Projekte beginnen mit einem Script, welches wiederum per "clear all; close all" gestartet wird.
Bei den allermeisten Programmen übersteigt die Debugzeit aber die Laufzeit bei weitem und wenn ein Programm gut ist und es auch in erweitertem Kontext verwendet werden soll, ist eine möglichst klare und einfache Programmstruktur wertvoller als Gold.
Selbst wenn man den Code nur mal eben im Forum posten möchte, können die 10 Sekunden, die man braucht um die merkwürdige WHILE-Schleife zu verstehen, den Unterschied ausmachen, ob man sich die Zeit nimmt zu antworten, oder abwartet, bis der Fragende etwas klareres postet.
Donald E. Knuth gab den Ratschlag: KISS - Keep it simple stupid. Und hier bedeutet "stupid" nicht "dumm" sondern "einfach". Wenn das Programm so simple aussieht, dass man es beim Drüberlesen sofort kapiert, ist es auch als Unterfunktion in einem 500'000 Zeilen Programm noch benutzbar. Falls nicht, ist Löschen die beste Idee.
Ja ist mir auch aufgefallen das meine Programme anfangs doch irgendwie liefen aber auch Zeit intensiv waren(Uni)... aber das war auch egal im Endefeckt hat man sie einmal verwendet und gut ist.
Doch jetzt.. Brauch ich das Programm für die Arbeit... Bei mehreren 100 Dateien mit über 100K einträgen.. da sitzt man bei einem langsamen Programm nen weilchen...
Aber das Programm hat eine Geschwindigkeit mit der Ich leben kann. Denke auch zu einem gewissen Teil wird die Hardware das größte Manko sein.
dateien=uigetdir('',link); %Verzeichnis der Dateien durch eingabe des Benutzer bekommen
cd(dateien); %Dateien Auslesen
[stat,Text]=fileattrib('*.txt'); %Die Attribute der Dateien Auslesen die meisten sind Sinnlos und leer
names={Text.Name}; %Die Namen der Dateien in eine "Tabelle" speichern wichtig für die Auswertung
x=1;
while(1)
File=names{x};
comma2point(File) %extra Funktion aus dem I-net gefischt und verändert Ersetzt die Kommas durch Punkte MATLAB braucht Punkte
Einlesen=dlmread(File,'\t',8,0); %Da die Dateien Einen Text Kopf und auch die Spalten Text enthalten und MATLAB nicht viel damit anfagen kann werden sie Rausgefilter (Nicht eingelesen)
Einlesen(:,4)=Einlesen(:,4).*1000;
Einlesen(:,6)=Einlesen(:,2).*Einlesen(:,3);
Einlesen(:,7)=Einlesen(:,4).*Einlesen(:,5);
S1=zeros(1,(size(Einlesen,1))-1);
for y = 2:(size(Einlesen,1))-1
S1(y)=(Einlesen(y,1)-Einlesen(y-1,1))*((Einlesen(y-1,6)+Einlesen(y,6))/2); %Eprimär Berechnung der Teil Integrale (Nummerisch) Es fehlt leider die Symbolic Toolbox mit der Währe es ein Schritt keine Schleife
end
dateien=uigetdir('',link); %Verzeichnis der Dateien durch eingabe des Benutzer bekommen
cd(dateien); %Dateien Auslesen
[stat,Text]=fileattrib('*.txt'); %Die Attribute der Dateien Auslesen die meisten sind Sinnlos und leer
names={Text.Name}; %Die Namen der Dateien in eine "Tabelle" speichern wichtig für die Auswertung
x=1; %Laufparameter für nachfolgende Schleife
while(1)
File=names{x}; %Dateien einzeln nehmen
comma2point(File) %extra Funktion aus dem I-net gefischt und verändert Ersetzt die Kommas durch Punkte MATLAB braucht Punkte
Einlesen=dlmread(File,'\t',8,0); %Da die Dateien Einen Text Kopf und auch die Spalten Text enthalten und MATLAB nicht viel damit anfagen kann werden sie Rausgefilter (Nicht eingelesen)
Einlesen(:,4)=Einlesen(:,4).*1000;
Einlesen(:,6)=Einlesen(:,2).*Einlesen(:,3);
Einlesen(:,7)=Einlesen(:,4).*Einlesen(:,5);
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.