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

elegante Lösung gesucht!

 

Matlab_Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.10.2011, 11:04     Titel: elegante Lösung gesucht!
  Antworten mit Zitat      
Hi,

folgendes: Ich bin gerade dabei ein Programm zur Auswertung von Messreihen aus einer Apparatur zu schreiben. Die Messdaten liegen mit *.dat-dateien vor.

In den Dateien sind die daten in verschiedene Kanäle unterteilt. Jede Spalte repräsentiert ein Kanal. Das dumme ist nun das jedes Experiment unterschiedlich viele Kanäle hat. Mal sind es 4, mal sind es 10, aber es sind nie mehr als 14.

Jede Zeile ist durch ein Zeilenumbruch beendet und die Spalten sind durch ein "tab" getrennt.

Das auslesen ist soweit gelöst, auch das zusammenstellen. Das dumme ist nun, das die Lösung extrem unelegant ist.
Wenn die Variable Pfad, der Pfad zu meiner Datei (form: C:\...\*.dat) ist, dann lautet meine Lösung:

Code:
[a,b,c,d,e,f,g,h,i,j,k,l,m,n]=...
    textread(Pfad,'%s%s%s%s%s%s%s%s%s%s%s%s%s%s','endofline',...
    '\r\n','whitespace','\t');

if isempty(char(a))==0
    data=[a];
    if isempty(char(b))==0
        data=[a,b];
        if isempty(char(c))==0
            data=[a,b,c];
            if isempty(char(d))==0
                data=[a,b,c,d];
                if isempty(char(e))==0
                    data=[a,b,c,d,e];
                        if isempty(char(f))==0
                            data=[a,b,c,d,e,f];
                            if isempty(char(g))==0
                                data=[a,b,c,d,e,f,g];
                                if isempty(char(h))==0
                                    data=[a,b,c,d,e,f,g,h];
                                    if isempty(char(i))==0
                                        data=[a,b,c,d,e,f,g,h,i];
                                        if isempty(char(j))==0
                                            data=[a,b,c,d,e,f,g,h,i,j];
                                            if isempty(char(k))==0
                                                data=[a,b,c,d,e,f,g,h,i,j,k];
                                                if isempty(char(l))==0
                                                    data=[a,b,c,d,e,f,g,h,i,j,k,l];
                                                    if isempty(char(m))==0
                                                        data=[a,b,c,d,e,f,g,h,i,j,k,l,m];
                                                        if isempty(char(n))==0
                                                            data=[a,b,c,d,e,f,g,h,i,j,k,l,m,n];
                                                        end
                                                    end
                                                end
                                            end
                                        end
                                    end
                                end
                            end
                        end
                end
            end
        end
    end
end


Wobei data dann eine erzeugte Matrix aus Strings ist, mit den Inhalt der Datei. Es müssen Strings sein, da dies für den weiteren Algorithmus von bedeutung ist.

Für diese hässlichen, riesigen If-Schleifen hätte ich gerne eine elegante Lösung. Mir will partu nichts einfallen. Hat da wer eine Idee?

Grüße,
Matlab_Gast


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.10.2011, 11:46     Titel:
  Antworten mit Zitat      
Hallo,

hat die Datei nur eine Zeile, oder sind in einer Spalte wenn alle Einträge leer? Vielleicht kannst du eine kleine Beispieldatei zur Verfügung stellen.

TEXTREAD ist veraltet und sollte durch TEXTSCAN ersetzt werden.

Grüsse,
Harald
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: 13.10.2011, 11:50     Titel: Re: elegante Lösung gesucht!
  Antworten mit Zitat      
Hallo Matlab_Gast,

Mir ist nicht klar, in welchem Format die Ausgaben vorliegen. CHAR-Matrizen halte ich für ausgesprochen unpraktisch. Vielleicht hilft dies weiter:

Code:
C = textscan(Pfad,'%s%s%s%s%s%s%s%s%s%s%s%s%s%s','endofline',...
    '\r\n','whitespace','\t');
data = cat(2, C{~cellfun('isempty', C)});

Den Cell String "data" könntest Du hinterher in das gewünschte Formt umwandeln. Matlab empfiehlt TEXTREAD durch das neuere TEXTSCAN zu ersetzen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast_Matlab

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.10.2011, 13:19     Titel:
  Antworten mit Zitat      
Hi,

Ja, ich weis das Matlab textread durch textscan ersetzen möchte, allerdings birgt textscan andere Probleme.
Ursprünglich hab ich damit auch gearbeitet, nur erzeugen dann files die eben nicht soviele Spalten/Kanäle haben, wie im Befehl vorgegeben, ein Error bzw. werden ignoriert.

Die vorgeschlagene Lösung hab ich ausprobiert, diese funktioniert leider nicht. Die ignoriert meine Files komplett. Liest nicht ein einziges File aus.

Ich benutze textread um dies zu umgehen. Es ist in mein Fall einfach der bessere Befehl. Dieser ermöglicht mir nehmlich auch Spalten/Kanäle aus zu lesen die eigentlich gar nicht da sind.

Dies beantwortet auch hoffentlich die andere Frage. Spalten/Kanäle die leer sind, wurden nicht benutzt ... und enthalten natürlich auch kein einzigen Eintrag. Da die im File gar nicht gespeichert werden.

Das file ist im Allgemein wie folgt augebaut:

Es handelt sich um mehrere Spalten, mit um die 4000 Einträge im Schnitt. Die haben z.b. Zeitangaben (Format: HH:MM:SS dd.mm.yyyy [Zeit Datum]), Zeilen mit Überschriften, Lücken, Leerzeilen und eben Messwerte. Alles was keine Zeitangabe und MEsswerte sind werden in den folgenden Schritten entfernt, dafür hab ich schon eine Lösung.

Die Lücken und das mehrfache Auftreten der überschriften kommt dadurch zustande das die Messreihen direkt aus der Apparatur aufgenommen wurden, man sieht daher z.b. Unterbrechungen, die Systemzeit oder schlichtweg datenverluste beim Übertragen.

Ein Beispiel mag ich nicht uploaden, da ich nicht weis ob ich diese veröffentlichen darf. Und ich werd das Risiko nicht eingehen, dafür eventuel Ärger zu bekommen ... Wink

Grüße,
Matlab_Gast
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 13.10.2011, 14:27     Titel:
  Antworten mit Zitat      
Hallo Gast_Matlab,
Zitat:
Die vorgeschlagene Lösung hab ich ausprobiert, diese funktioniert leider nicht. Die ignoriert meine Files komplett. Liest nicht ein einziges File aus.

Dann ist darin offensichtlich ein Bug enthalten. Statt die ganze Lösung über Bord zu werfen, sollte man lieber diesen Bug beheben: TEXTSCAN nimmt als ersten Input die FID entgegen. Wenn es ein String ist, wird der nicht als File-Namen, sondern als String interpretiert.
Code:
FID = fopen(FileName, 'r');
textscan(FID, ...)

Es wäre hilfreich, wenn Du wenigstens ein paar Zeilen aus den Files posten könntest. Dann könnten wir nämlich unsere Vorschläge testen, bevor wir sie posten. Wenn Du ein paar zahlen änderst und die Überschriften durch "A", "B" etc änderst, wird das kaum mit dem Urheberrecht kollidieren.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Kevin
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 93
Anmeldedatum: 18.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.10.2011, 15:43     Titel:
  Antworten mit Zitat      
Hi,
ich Stelle mal die Behauptung auf, dass die *.dat Datei (eigentlich wahrscheinlich ASCII) nie leere Spalten enthält.
Dann hast du mehere Möglichkeiten:
1. lies die Datei binär character für character:
>die Anzahl der Werte 13 (==ENTER) ist Zeilenzahl, also Zahl der Messungen.
-->Du hast also Zeilen identifiziert
>die Zahl der Werte 9 in einer Zeile ist die Zahl der Tabs, somit ist die Anzahl der Neunen plus eins= Spaltenzahl
--> Jetzt musst du daraus nur noch nen array machen
Das klingt nach großem Rechenaufwand ist aber relativ schnell.

2. Lies doch einfach Zeile für Zeile ein und trenn' die Spalten an den Tabs
>hier auch wieder NUM_TABS+1 =Spalenzahl

3. In scilab gibt es eine subroutine zum einlesen (aus einer Datei) von arrays die nur aus Zahlen bestehen. Guck mal ob es das in matlab auch gibt.

4. Gibt es keine Routine die Excel-kompatible files liest? Denn so, wie du den file beschreibst, ist er Excel-kompatibel.

Wenn du aber bei deiner Lösung bleiben willst, dann ersetz' doch diese Monster-if-Schachtel lieber durch einen logischen Ausdruck. Das kostet zwar mehr Denkzeit, ist aber für nachfolgende Generationen, die dein Programm benutzen wollen einfacher nachzuvollziehen.

Gruß
Kevin
_________________

1000 Buchstaben? Warum nur 6?
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.