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

dlmwrite oder lieber xlswrite

 

Florre
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 28.02.13
Wohnort: ---
Version: R2009a, R2016b
     Beitrag Verfasst am: 01.03.2013, 15:48     Titel: dlmwrite oder lieber xlswrite
  Antworten mit Zitat      
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
Code:
nummerbild=sprintf('%s%s',names{x},'_neu.txt');
    dlmwrite(nummerbild,Einlesen,'delimiter', '\t');

oder doch lieber
Code:
xlswrite(nummerbild,Einlesen,1);

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:


close all                                                                   %1. und 2. Zeile zum löschen des Speichers


link='C:\Benutzer\Florre\Desktop\Strömung\Test\hu';                           %Eingabe Arbeitsverzeichnis/Auszuführende Datei

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);                            
   
    %Eprimär Berechnen
   
 
    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);  
    end
 
     Sa=zeros(1,size(Einlesen,1));                                                                
    g=2;
        while(1)
        Sa(g)=Sa(g-1)+S1(g);
        g=g+1;
        if ((g)>length(S1)) ,break,end
        end
      Sa(g)=Sa(g-1);  
     
   
    S2=zeros(1,(size(Einlesen,1))-1);

    for y = 2:(size(Einlesen,1))-1
        S2(y)=(Einlesen(y,1)-Einlesen(y-1,1))*((Einlesen(y-1,7)+Einlesen(y,7))/2);
    end
   
    Sb=zeros(1,size(Einlesen,1));
   g=2;
        while(1)
        Sb(g)=Sb(g-1)+S2(g);
        g=g+1;
        if ((g)>length(S2)) ,break,end
        end
    Sb(g)=Sb(g-1);
   
   
         M=Sb./Sa;                                                          
    Einlesen(:,8)=Sa';
    Einlesen(:,9)=Sb';
    Einlesen(:,10)=M';                                                      
    %format('longg');
    %Kopf=dlmread(File,'\t',8,0);
    %Tabellenkopf=dlmread(File,'\t',8,0);
     nummerbild=sprintf('%s%s',names{x},'_neu.txt');
    dlmwrite(nummerbild,Einlesen,'delimiter', '\t');                 %Speichern Meiner Neuen Datei
            x=x+1;
  if (x>length(names)) ,break,end
end


Druck_131.txt
 Beschreibung:

Download
 Dateiname:  Druck_131.txt
 Dateigröße:  2.85 KB
 Heruntergeladen:  336 mal
Private Nachricht senden Benutzer-Profile anzeigen


Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.03.2013, 19:21     Titel:
  Antworten mit Zitat      
Hallo Florre,

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.
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: 04.03.2013, 01:56     Titel:
  Antworten mit Zitat      
Hallo Florre,
Code:
g=2;
    while(1)
        Sb(g)=Sb(g-1)+S2(g);
        g=g+1;
        if ((g)>length(S2)) ,break,end
        end

Das ist als FOR-Schleife zumindest hübscher:
Code:

for g=2:length(S2)
  Sb(g) = Sb(g-1)+S2(g);
end

Wie wäre dies:
Code:
n = length(S2);
Sb(2:n) = Sb(1:n-1) + S2(2:n);

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 28.02.13
Wohnort: ---
Version: R2009a, R2016b
     Beitrag Verfasst am: 04.03.2013, 08:36     Titel:
  Antworten mit Zitat      
Hallo Jan,

Sorry das ich erst Jetzt antworte ja ist es... werd es mal in eine For Schleife umwandeln..

Hoffe dann ist es immer noch genauso schnell...

Lg Florre
Private Nachricht senden Benutzer-Profile anzeigen
 
Florre
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 28.02.13
Wohnort: ---
Version: R2009a, R2016b
     Beitrag Verfasst am: 04.03.2013, 08:40     Titel:
  Antworten mit Zitat      
Hallo Sirius3,

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

LG Florre
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: 04.03.2013, 09:45     Titel:
  Antworten mit Zitat      
Hallo Florre,

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:
Code:
Lösungszeit = Designzeit + Programmierzeit + Debugzeit + Laufzeit

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.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 28.02.13
Wohnort: ---
Version: R2009a, R2016b
     Beitrag Verfasst am: 04.03.2013, 10:12     Titel:
  Antworten mit Zitat      
Hallo Jan,

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.

Lg Florre
Private Nachricht senden Benutzer-Profile anzeigen
 
Florre
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 28.02.13
Wohnort: ---
Version: R2009a, R2016b
     Beitrag Verfasst am: 04.03.2013, 10:20     Titel:
  Antworten mit Zitat      
Jetzt mal zurück zu meinem Problem

Ich Poste mal mein Komplettes Programm.
Code:

link='C:\Benutzer\Florre\Desktop\Strömung\Test\hu';                           %Eingabe Arbeitsverzeichnis/Auszuführende Datei

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
 
     Sa=zeros(1,size(Einlesen,1));                                                                 %mein Eigentliches Integral
     
  for g=2:length(S1)
       Sa(g)=Sa(g-1)+S1(g);
  end
   Sa(g+1)=Sa(g);
     
    S2=zeros(1,(size(Einlesen,1))-1);

    for y = 2:(size(Einlesen,1))-1
        S2(y)=(Einlesen(y,1)-Einlesen(y-1,1))*((Einlesen(y-1,7)+Einlesen(y,7))/2);
    end
   
    Sb=zeros(1,size(Einlesen,1));
   
   for g=2:length(S2)
       Sb(g)=Sb(g-1)+S2(g);
   end
   Sb(g+1)=Sb(g);
     
         M=Sb./Sa;                                                          
    Einlesen(:,8)=Sa';
    Einlesen(:,9)=Sb';
    Einlesen(:,10)=M';                                                      
    nummerbild=sprintf('%s%s',names{x},'_neu.txt');
 
    fid=fopen(nummerbild,'wt');
    fprintf(fid,'%s\t','Time','Primaerspannung','Primaerstrom','Sekundaerspannung', ...
        'Sekundaerstrom','Primaerleistung','Sekundaerleistung','Primaerenergie','Sekundaerenergie','Wirkungsgrad');
     fprintf(fid,'\n');
     fprintf(fid,'%s\t','s','V','A','V','A','W','W','Ws','Ws','%');
     fprintf(fid,'\n');
     fprintf(fid,'%f\n',Einlesen);
     fclose(fid);
 
                x=x+1;
  if (x>length(names)) ,break,end
end


Jetzt hab ich nen kleines Problem.....
Code:
fid=fopen(nummerbild,'wt');
    fprintf(fid,'%s\t','Time','Primaerspannung','Primaerstrom','Sekundaerspannung', ...
        'Sekundaerstrom','Primaerleistung','Sekundaerleistung','Primaerenergie','Sekundaerenergie','Wirkungsgrad');
     fprintf(fid,'\n');
     fprintf(fid,'%s\t','s','V','A','V','A','W','W','Ws','Ws','%');
    fprintf(fid,'\n');
 

Das läuft soweit
nur
Code:
   fprintf(fid,'%f\n',Einlesen);
 

Das macht nicht was es soll..
Das schreibt mir Alle einträge in eine Spalte
wenn ich statt
Code:
Code:

bekomm ich nur ne Spalte
was muss ich denn ändern?

LG Florre
Private Nachricht senden Benutzer-Profile anzeigen
 
Florre
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 28.02.13
Wohnort: ---
Version: R2009a, R2016b
     Beitrag Verfasst am: 04.03.2013, 11:22     Titel:
  Antworten mit Zitat      
So hab jetzt ne Möglichkeit gefunden. Funktionier zumindestens.
Ob es schön ist, ist ne andere Frage... Very Happy

Nur eines Find ich nicht so schön....
Und Zwar würd ich gerne meine erste Spalte (Time) mehr Zahlen haben aber man kann wohl nicht alles haben... Sad

Trotzdem Danke an Alle die mir geholfen haben...

noch zum Schluß mein fertiges Programm.

LG FLorre

Code:

format('long');                                                            %Richtige Gleitkomma einstellung

link='C:\Benutzer\Florre\Desktop\Strömung\Test\hu';                           %Eingabe Arbeitsverzeichnis/Auszuführende Datei

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);                            
   
 
   
 
    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);  
    end
 
     Sa=zeros(1,size(Einlesen,1));                                                                
     
  for g=2:length(S1)
       Sa(g)=Sa(g-1)+S1(g);
  end
   Sa(g+1)=Sa(g);
   
   
    S2=zeros(1,(size(Einlesen,1))-1);

    for y = 2:(size(Einlesen,1))-1
        S2(y)=(Einlesen(y,1)-Einlesen(y-1,1))*((Einlesen(y-1,7)+Einlesen(y,7))/2);
    end
   
    Sb=zeros(1,size(Einlesen,1));
   
   for g=2:length(S2)
       Sb(g)=Sb(g-1)+S2(g);
   end
   Sb(g+1)=Sb(g);
       
   
         M=Sb./Sa;                                                          
    Einlesen(:,8)=Sa';
    Einlesen(:,9)=Sb';
    Einlesen(:,10)=M';                                                      
    nummerbild=sprintf('%s%s',names{x},'_neu.txt');
 
    fid=fopen(nummerbild,'wt');
    fprintf(fid,'%s\t','Time','Primaerspannung','Primaerstrom','Sekundaerspannung', ...
        'Sekundaerstrom','Primaerleistung','Sekundaerleistung','Primaerenergie','Sekundaerenergie','Wirkungsgrad');
     fprintf(fid,'\n');
     fprintf(fid,'%s\t','s','V','A','V','A','W','W','Ws','Ws','%');
     fprintf(fid,'\n');
     %fprintf(fid,'%20.18f\n',Einlesen);
    fclose(fid);

    dlmwrite(nummerbild,Einlesen,'delimiter', '\t','-append');                
    point2comma(nummerbild)
            x=x+1;
  if (x>length(names)) ,break,end
end
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 - 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.