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

Probleme bei Porgramm rund um textscan, load, str2mat, etc

 

MiKo
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 08.01.12
Wohnort: Hannover
Version: ---
     Beitrag Verfasst am: 16.08.2012, 09:19     Titel: Probleme bei Porgramm rund um textscan, load, str2mat, etc
  Antworten mit Zitat      
Guten Morgen,

ich bin gerad dabei ein für meine Programmier Verhältnisse kompliziertes Programm zu basteln. Ich habe mittels des Forums und der Matlab help ein Grundgerüst aufgestellt. Der Bereich des textscan klappt soweit auch ganz gut. Ich poste zunächst einmal meinen Code und erkläre dann nochmal meine Intentionen...

Code:
function [ ] = TestFilter( )

for i=1:2
    for j=1:2
       
        fid=fopen(['load Filter' num2str(i) num2str(j) '.txt']);
        % es sollen nacheinander Dateien mit "NAMEij" durchnummeriert geöffnet werden, ergibt aber error: der name wird nicht als datei erkannt
        data = {};
        while ~feof(fid)
            l=fgetl(fid);  % alle zeilen lesen, deren 4tes zeichen 1,2,..,7 ist
           if ~isempty(l) && (strcmpi(l(4), '0') || strcmpi(l(4), '1') || strcmpi(l(4), '2') || strcmpi(l(4), '3') || strcmpi(l(4), '4') || strcmpi(l(4), '5') || strcmpi(l(4), '6') || strcmpi(l(4), '7'))
               %% ersteinmal bis 7 gewählt, aber es soll so sein, das "j+3" die höchstzahl bildet (Schleife von 1 bis j+3?)
        q=repmat('%s',1,40);
        data= [data; textscan(l, q, 'delimiter', ' ')];
           end
           save data
           data = str2num(char(data));
      % %eigentlich soll "data" gespeichert werden, sodass ich mir die %einträge auch angucken kann
       % %Die Werte aus data sollen in einer Matrix dargestellt werden.
                      %  %%Alternative habe ich "M=[data{4} data{8} data{12}
                     %  % %data{16} data{20} data{24}];" gedacht, hat bei
                       % %einem Versuch außerhalb dieser fkt auch
                     %   %%funktioniert, WICHTIG: die matrix soll einzeln für
                      %  %%jeden durchgang der schleifen gespeichert werden
     
        end   % %anscheinend gibt es auch Probleme mit dem "end" das zu  %while gehört, eig würd ich es weglassen, schleife hört ja am ende
              % %der datei auf (oder?), aber das end, das unten steht %verbindet sich selbst mit while anstatt mit for
    end  
end      
end


Mein Ziel ist es am Ende eine Matrix zu erhalten, sodass ich dann leicht dort bestimmte Spalten ablesen kann und ähnliches.

Ich habe dafür eine große Anzahl an Dateien, die jeweils durchnummeriert werden mit "Nameij"die Textdatei soll geöffnet werden.
Hierbei tritt leider schon ein Fehler auf, ist load nicht der richtige Befehl?

und dann wird mit dem textscan ab der zeile 14 alle Zeilen, die eine 1,...,7 (bzw im allg 1,...,j) an der Stelle vier der Zeile haben eingelesen [Das klappt auch soweit ganz gut mit dem textscan Befehl]

Nun sollen eigentlich auch "nur" noch die Ergebnisse in eine Matrix überführt werden, wobei für jede Datei eine einzelne Matrix erstellt werden soll, die Matrix muss also auch einen "variablen Teil" enthalten.

Ich hoffe das sind nicht zu viel Baustellen auf einmal, aber ich dachte es ist vielleicht besser zu erläutern, wenn man den Code im ganzen sieht...

Ich freue mich über Anregungen und Antworten, vielen Dank!

Grüße MiKo
p.s. Damit ihr eine Vorstellung der txt Datei habt, hab ich mal eine Beispiel Datei angehängt...

Filter11.txt
 Beschreibung:

Download
 Dateiname:  Filter11.txt
 Dateigröße:  2.55 KB
 Heruntergeladen:  424 mal
Private Nachricht senden Benutzer-Profile anzeigen


MiKo
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 08.01.12
Wohnort: Hannover
Version: ---
     Beitrag Verfasst am: 16.08.2012, 12:14     Titel:
  Antworten mit Zitat      
Hallo, ich dachte ich poste noch die Fehlermeldung, die meiner Meinung nach wegen den ersten Zeilen, also dem load Befehl ensteht

Code:
??? Error using ==> feof
Invalid file identifier.  Use fopen to generate a valid file identifier.

Error in ==> TestFilter at 10
        while ~feof(fid)
Private Nachricht senden Benutzer-Profile anzeigen
 
MiKo
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 08.01.12
Wohnort: Hannover
Version: ---
     Beitrag Verfasst am: 17.08.2012, 06:45     Titel:
  Antworten mit Zitat      
Guten Morgen,

schade, es gab noch keine Anregungen für mein Programm... Ich habe gestern noch weiter dran gearbeitet und hatte mir eine Frage eigentlich selbst aus dem Weg geräumt, dachte ich zumindest. Ich wollte die Schleife rund um den Befehl
Code:
umgehen, als Bedingung die Werte der Zeile 12 nehme, da diese stets gleich sind und somit unabhängig vom j.

Leider hat dies nicht geklappt, es wurde nicht das richtige Resultat erreicht, weiß jemand vielleicht woran dies liegt?
Ich habe es als Test auch mit der Zeile 8 versucht, dies ging ebenfalls schief.

Hier nocheinmal der Code mit Zeile 12:

Code:
 while ~feof(fid)
            l=fgetl(fid);  % alle zeilen lesen, deren 12tes zeichen 0,1,2,..,6 ist
           if ~isempty(l) && (strcmpi(l(12), '0') || strcmpi(l(12), '1') || strcmpi(l(12), '2') || strcmpi(l(12), '3') || strcmpi(l(12), '4') || strcmpi(l(12), '5') || strcmpi(l(12), '6'))
             
       q=repmat('%s',1,40);
        data= [data; textscan(l, q, 'delimiter', ' ')];
           end
 


Ich würde mich wirklich über Hilfe freuen, ich komm echt nicht weiter im Moment...Jeder kleine Hinweis kann mir helfen!

Viele Grüße MiKo
Private Nachricht senden Benutzer-Profile anzeigen
 
draussen
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 90
Anmeldedatum: 26.11.10
Wohnort: DE
Version: 2010b,2020a
     Beitrag Verfasst am: 17.08.2012, 08:23     Titel:
  Antworten mit Zitat      
Hallo,


zu dem ersten Problem kann man eigentlich direkt sagen, dass bei
Code:

 fid=fopen(['load Filter' num2str(i) num2str(j) '.txt']);
 


kein richtiger file identifier raus kommen kann. Ich gehe mal davon aus, dass "load" nicht im filename vorkommt.

Es muss also

Code:

 fid=fopen(['Filter' num2str(i) num2str(j) '.txt']);
 


heißen.

MfG

Georg
_________________

Der Einäugige ist unter den Blinden der König!!!
Private Nachricht senden Benutzer-Profile anzeigen
 
MiKo
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 08.01.12
Wohnort: Hannover
Version: ---
     Beitrag Verfasst am: 17.08.2012, 08:40     Titel:
  Antworten mit Zitat      
Hey Georg, vielen dank für deine Antwort! Das ist ja absolut einleuchtend!

Das klappt nun also schon mal:)
ich poste dann nochmal den aktuellen Code:

Code:
function [ ] = TestFilter( )

for i=1:2
    for j=1:2
     
     
        fid{i,j}=fopen(['Filter' num2str(i) num2str(j) '.txt']);
 
        z{i,j}={};
        while ~feof(fid{i,j})
         l=fgetl(fid{i,j}); % %alle zeilen lesen, deren 4tes zeichen 0,1,,2,..,6 ist
           if ~isempty(l) && (strcmpi(l(4), '0') || strcmpi(l(4), '1') || strcmpi(l(4), '2') || strcmpi(l(4), '3') || strcmpi(l(4), '4') || strcmpi(l(4), '5') || strcmpi(l(4), '6'))
              % % ersteinmal bis 6 gewählt, aber es soll so sein, das "j" die  höchstzahl bildet (Schleife von 1 bis j? Alternativ: Stelle 12 der jeweiligen Zeile)
        q=repmat('%s',1,40);
       z{i,j}= [z{i,j}; textscan(l, q, 'delimiter', ' ')];
           end
           save z{i,j}
         
        end    
        fclose(fid{i,j});      
    M{i,j} = [[z{:,4}]' [z{:,8}]' [z{:,12}]' [z{:,16}]'];
    L{i,j} = str2double(M{i,j});
    end
end      
end


Also wie gesagt meine Problemchen liegen nun noch

1. In dem Befehl strcmpi, das ich gern anstatt
Code:
lieber das ganze mit Stelle 12 der Zeilen(also:
Code:
machen möchte, da ich so die Schleife umgehe.

2. Die Variablen z, M, L sollen jeweils abhängig vom Laufindex i und j gespeichert werden, ich dachte das das mit
Code:
geht, aber wenn man dies bei z macht ist ja schon Ärger vorprogrammiert, da
Code:
für mich nicht sinnvoll aussieht... Wie könnte ich das denn einfach lösen?

Ja dies sind wohl die beiden Knackpunkte des Codes...

Über weitere Hilfe bin ich sehr dankbar:)
Viele Grüße MiKo
Private Nachricht senden Benutzer-Profile anzeigen
 
draussen
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 90
Anmeldedatum: 26.11.10
Wohnort: DE
Version: 2010b,2020a
     Beitrag Verfasst am: 17.08.2012, 09:55     Titel:
  Antworten mit Zitat      
Hallo,

kann immer nur mal kurz hier rein schauen. Wenn ich das richtig verstanden habe willst Du von strcmpi weg.

Folgenden Teil:

Code:

(strcmpi(l(4), '0') || strcmpi(l(4), '1') || strcmpi(l(4), '2') || strcmpi(l(4), '3') || strcmpi(l(4), '4') || strcmpi(l(4), '5') || strcmpi(l(4), '6'))
 


kann man so vereinfachen:
Code:

(str2double(l(4))>=0 && str2double(l(4))<=6)
 


Ich habe aber noch nicht den Einwand verstanden warum man bei Verwendung von Zeile 12 eine Schleife umgeht.

Punkt 2 muss ich mir später nochmal anschauen...


MfG

Georg
_________________

Der Einäugige ist unter den Blinden der König!!!
Private Nachricht senden Benutzer-Profile anzeigen
 
draussen
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 90
Anmeldedatum: 26.11.10
Wohnort: DE
Version: 2010b,2020a
     Beitrag Verfasst am: 17.08.2012, 10:01     Titel:
  Antworten mit Zitat      
...oder noch einfacher:
Code:

_________________

Der Einäugige ist unter den Blinden der König!!!
Private Nachricht senden Benutzer-Profile anzeigen
 
MiKo
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 08.01.12
Wohnort: Hannover
Version: ---
     Beitrag Verfasst am: 17.08.2012, 11:43     Titel:
  Antworten mit Zitat      
Hallo, vielen Dank für die Codes,

mit deinem ersten Code hat es eigentlich Super geklappt, ich kann sogar anstatt der zweiten Grenze 6 mir eine variable Grenze (j+3) definieren Smile

Jedoch tritt ein doofer Nebeneffekt auf, den ich mir so nicht erklären kann. In der ersten Zeile von z werden Bruchstücke der einen Zeile aus dem Header mit gespeichert:

'Split' 'from' 'parent:' 'G' '=' 'Ghost,' 'E' '=' 'Diffracted,' 'F' '=' 'Scattered'


Dabei Beginnt die Zeile ja offensichtlich nicht mit einer Zahl...

Hast du dafür vllt eine Erklärung?

Ich habe mir auch überlegt, ich könnte ja einfach dem
Code:
Befehl anfügen das erst ab Zeile 14 gelesen werden soll (ab Zeile 14 beginnen nämlich erst die relevanten Zeilen)

Code:
if ~isempty(l) && (str2double(l(4))>=0 &&  str2double(l(4))<=(j+3))              
                       
        q=repmat('%s',1,40);
       z= [z; textscan(l, q, 'delimiter', ' ', 'HeaderLines', 14)];


Das klappt auch insofern, das die obere Zeile aus dem cell z weg ist, jedoch sind auch alle anderen Einträge verschwunden und lediglich Klammern ([]) in den Einträgen...

Das verstehe ich erst recht nicht, denn diesen Befehl hatte ich vor ein paar Tagen shcon entdeckt und auch so angewendet immer

Viele Grüße
MiKo

p.s. das mit dem 12 eintrag anstatt dem vierten sollte ein trick sein, denn in diesem Eintrag treten nur Zahlen von 1 bis 6 auf, unabh. von dem j. Aber der Befehl den du mir gezeigt hast ist viel besser, wenn ich jetzt noch das mit der ersten zeile hinbekomme;)
Private Nachricht senden Benutzer-Profile anzeigen
 
MiKo
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 08.01.12
Wohnort: Hannover
Version: ---
     Beitrag Verfasst am: 22.08.2012, 09:24     Titel:
  Antworten mit Zitat      
Hmmm...

Hat niemand ne kleine Idee, die mir helfen würde oder sieht vielleicht sogar meinen Fehler?

Ich komm echt gar nicht voran...

Danke Euch,

Gruß MiKo
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.08.2012, 10:09     Titel:
  Antworten mit Zitat      
Hallo,

für mich ist weder nachvollziehbar, welcher Code nun eigentlich ausgeführt wird und mit welcher Datei, und inwiefern das Ergebnis vom erwarteten abweicht.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MiKo
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 08.01.12
Wohnort: Hannover
Version: ---
     Beitrag Verfasst am: 22.08.2012, 10:25     Titel:
  Antworten mit Zitat      
Hallo,

entschuldigung, wahrscheinlich habe ich alles so formuliert, das es wohl nur draussen verstanden hätte, der mir die erste Hilfe gegeben hat...

Also hier nochmal besser formuliert (hoffe ich zumindest Smile )

Ich schreibe ein Code mit dem ich eine Reihe von Text Dateien einlese und von diesen bestimmten bestimmte Zeilen (bzw. deren Einträge) in einer Matrix speichere.

Hierzu habe ich bereits ein Gerüst gebaut und bin nun an dem Feinschliff...
Hier erstmal der aktuelle Code:

Code:
function [ ] = TestFilter( )

for i=1:2
    for j=1:2
     
     
        fid[{i,j}=fopen(['Filter' num2str(i) num2str(j) '.txt']);
       
        z={};
        while ~feof(fid{i,j})
            l=fgetl(fid{i,j}); % alle zeilen, deren 4tes zeichen 0,1,..,j+3 ist
         
 if ~isempty(l) && (str2double(l(4))>=0 &&  str2double(l(4))<=(j+3))
             
   
        q=repmat('%s',1,40);
       z= [z; textscan(l, q, 'delimiter', ' ', 'HeaderLines', 14)]; % Header (geht in jeder Datei bis Zeile 13) überspringen
           end
           save z
         
        end    
        fclose(fid{i,j});
    M = [[z{:,4}]' [z{:,8}]' [z{:,12}]' [z{:,16}]' [z{:,20}]' [z{:,24}]'];
   L = str2double(M);



Die Baustellen, die ich nun habe sind die Folgenden:

1. Lasse ich mir nun z anzeigen enthalten die einträge nur "[]" Klammern, jedoch nicht die gewünschten Einträge.
Ich denke, das das etwas mit dem Befehl
Code:
'HeaderLines'
zu tun hat, weiß jedoch nicht was ich verändern soll.

2. Außerdem muss ich zudem noch z in abhängigkeit von i und j darstellen. Im Moment wird das z ja in jedem Durchgang der Schleife überschrieben. Dies soll nicht passieren....
Ich dachte an eine Formulierung der Art:
Code:

Das selbe gilt natürlich auch für M und L...


Ich hoffe das ich es etwas verständlicher darstellen konnte...
Achso, eine Beispiel Textdatei habe ich oben in meinem ersten Beitrag beigefügt....


Grüße MiKo
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.08.2012, 13:49     Titel:
  Antworten mit Zitat      
Hallo,

danke für die Klarstellung; die Datei hatte ich übersehen.

Die fehlenden end's habe ich am Ende eingefügt - ich hoffe, dort sollen sie hin.

Das Problem: du liest Zeile für Zeile ein (Programmzeile 11) .
l beinhaltet dann logischerweise immer nur eine Zeile, und wenn du 13 überspringst (Programmzeile 1Cool, bleibt nichts übrig.

Ich würde das fgetl weglassen und textscan direkt auf fid anwenden, wenn nichts dagegenspricht.

Das ist zumindest mal ein Problem. Wenn es noch weitere gibt, kannst du dich ja melden.
Zahlen würde ich übrigens mit %f statt %s einlesen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MiKo
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 08.01.12
Wohnort: Hannover
Version: ---
     Beitrag Verfasst am: 22.08.2012, 14:20     Titel:
  Antworten mit Zitat      
Hallo,

danke für die Rückmeldung!
Jaaa die "ends" sind mir wohl beim kopieren abhanden gekommen;)

Dann versuch ich mich erstmal mit den neuen Hinweisen weiter an dem Code, Fragen werden bestimmt auch noch auftreten...

Viele Grüße
MiKo
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.