Verfasst am: 13.08.2010, 14:41
Titel: Mehrere Matrizen in eine Variable laden, und weiterrechnen
Hallo Leute )
Bin neu hier, und habe ne ganz dringende Frage/Bitte:
Ich soll ein Programm schreiben, welches mehrere Daten aus einem Verzeichnis laden soll,
die von 3 Variablen und dem Pfad abhängen sollen, so dass man z.B. nur eingeben muss
und man erhält die gewünschten Daten zusammen in eine Matrix.
Das sind sehr große Matrizen, mit gleicher Spaltenanzahl aber manchmal unterschiedlicher Zeilenanzahl.
Da ich der Programmierung noch nicht sonderlich mächtig bin,
habe ich erst ein Script geschrieben ( mit elseif Befehlen), welches
1. nur einzelne Dateien laden kann,
2. die nicht in eine Matrix schreibt, und
3. ich nicht weiß, wie ich den Dateipfad da eingeben muss =))
Bitte verzweifelt um Hilfe =)
Danke im Vorraus
Paet0r )
also mir ist noch nicht klar was du genau haben möchtest.
wie liegen die daten vor? als textdatei, csv...? du kannst vlt eine datei hochladen, oder zumindest sagen wie die werte aussehen (durch komma getrennt, leerzeichen....).
Hi )
Also die Dateien liegen als "einfache Dateien vor" (ich glaub das hieß ASCII )
Habe mal eine angehängt.
Davon gibt es ganz viele. Diese haben 3 werte
1: den Wert nach Phs:01-03 ;
2: den Wert danach: _00001-00048 und
3: den Wert danach: _00001_00002
und die sind in Ordner, die sich in verschiedenen Pfaden befinden.
Ich brächte ein Script/eine Funktion,
die bei Benutzung durch die Eingabe der Variablen von 01-03 ; 00001-00048 und 00001 bis 00002
sowie des Pfades,
die gewünschten Dateien läd, und sie in eine Große Matrix, wo die ausgewählten Dateien alle drin sind in den Workspace speichert, sodass man damit weiterrechnen kann.
(und mit 1, 13:48, 0:1 als Beispiel meinte ich halt, dass alle Dateien phs01_00013bis48_00001 (+ der gewünschten Directory) geladen werden sollen und in eine atrix geschrieben werden sollen )
Klingt wohl nach ziemlich viel, dachte aber, dass mir einfach ein bestimmter Befehl fehlt. Habe es auch schon mit for-schleifen ausprobiert etc., klappt aber alles nicht.
Hiho =)
Also das Script scheint zu funktionieren =)
An dieser Stelle nochmal vielen Dank )
Aber da gibts noch ein paar Kleinigkeiten.
Die Funktione speichert die geladenen Matrizen in den Workspace als M, aber um damit rechnen zu können, muss ich
als Beispiel eingeben.
Außerdem sind die Matrizen(M{1,1} etc.) nicht so wie in der Datei, eine 7 x "viel" Matrix, sondern hat noch eine neue, erste, Spalte, die nur aus 0 besteht, also ist eine 8 x "viel" Matrix geworden.
Kann man das wegbekommen irgendwie? =)
Die nächste Frage wäre, ob ich diese Matrizen M{i,i} auch gleich alle in eine Variable speichern kann, also so, dass alle Werte in einer Matrix untereinander weg stehen.
Ich hab mich über den Befehl
Würde es damit gehen? Habs eig. so verstanden, dass er einen bestehenden file mit einer weiteren Matrix erweitert, und diese dann abspeichert. Würde es auch so gehen, dass dieser Befehl im vorhergegangenen Script enthalten ist, und alle Matrizen (ohne die erste Nullspalte =) ) in eine Variable gespeichert werden?
Eine Antwort wäre abermals lebensrettend =)
Danke im Vorraus )
Paet0r
Die nächste Frage wäre, ob ich diese Matrizen M{i,i} auch gleich alle in eine Variable speichern kann, also so, dass alle Werte in einer Matrix untereinander weg stehen.
ich weiss nicht was daran gut sein kann, aber du weisst es
also ich greif auf die matroze mit M{1}....
und das mit der zuzätzlichen spalte verstehe ich auch nicht, kann sein dass bei deinen dateieen irgendeine nuller spalte versteckt ist ;) ansonsten:
Und abermals, viele dank =)
Musste zwar ein wenig was umschreiben, aber es klappt einwandfrei =)
Bin mir zwar nicht ganz sicher, ob ich alle Befehle richtig verstanden habe, aber so sieht das script jetzt aus:
Code:
function[M] = fc(a,b,c,d,e,f,pfad)
%Function to loadany amount of files of target direction
%with the name like: phs0a-b_000c-d_0000e-f
%Using the variables of the function to define the file name
%fix and mod are used to round the variables c and d, so if u use
%Numbers from 1 to 9, they're written as 01-09
string = sprintf('phs0[%d-%d]_000[%d-%d][%d-%d]_0000[%d-%d]',...
a,b,fix(c/10),fix(d/10),mod(c,10),mod(d,10),e,f);
%defining list as the direction u've chosen by typing the variables in Octave-command-window
list=dir([pfad,'\*']);
%defining names as a combination of list and names
names={list.name};
%regexpis used to check names with the string above and saveall the matched ones in X
X=regexp(names,string,'match'); #
%returns all empty cells of X
ind=cellfun('isempty',X);
%~means "not", or in our case "without"
%so X now stands forall the files, which could be identified through our function(insert)
X=X(~ind);
%returns the length of all this files in a vector
len=length(X);
%for-loop to read all the files defined through the function-insert
%in reads all the files which matched through regexp and identified by cellfun for ii=1:1:len
C{ii}=dlmread(fullfile(pfad,char(X{ii})));
%due to an unknown reason, it returns the files with an additional 0-vector as first, this is needet to delete it
C{ii}(:,1)=[]
%all the matrices are saved in workspace one by one,(in a cell), this is needet to bring em all in one matrix(double)
M = cell2mat(C')
%fix and mod are used to round the variables c and d, so if u use
%Numbers from 1 to 9, they're written as 01 -09
das es so geworden ist war nicht beabsichtigt, es ist aber gut so
der grund warum ich es getan habe war zahlen wie 23 zu trennen 2 und 3.
wie du in der sprintf funktion siehst gibts 8mal %d, während die funktion nur 6 zahlen benötigt. aber wie ich sagte an deiner erklärung sollte ich eigentlich auch denken, hat sich aber von alleine erledigt.
Zitat:
%returns all empty cells of X
ind=cellfun('isempty',X);
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.