Verfasst am: 16.08.2012, 09:19
Titel: Probleme bei Porgramm rund um textscan, load, str2mat, etc
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...
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...
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
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.
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
mit deinem ersten Code hat es eigentlich Super geklappt, ich kann sogar anstatt der zweiten Grenze 6 mir eine variable Grenze (j+3) definieren
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:
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;)
für mich ist weder nachvollziehbar, welcher Code nun eigentlich ausgeführt wird und mit welcher Datei, und inwiefern das Ergebnis vom erwarteten abweicht.
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 )
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:
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
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:
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 1, 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.
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
Einstellungen und Berechtigungen
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.