Verfasst am: 23.05.2014, 14:30
Titel: Matrix auslesen un in neue Matrix schreiben
Hallo Zusammen,
als blutjunger Matlabanfänger könnte ich eure Hilfe echt gut gebrauchen.
ich hänge an einem wahrscheinlich kleinen Problem. Ich habe mehrere unterschiedliche Messdateien (asc-format). (Habe sie mal als Txt datei angehängt)Diese werden über dlmread eingelesen. Jedoch enthalten die Matrizen, die dadurch entstehen auch die 0 als Eintrag.
In eine neue Matrix sollen alle Zeilen, in denen keine 0 enthalten ist, damit über die Spalten dann der Mittelwert gebildet werden kann.
Wie kann ich die alte Matrix "auslesen" und dann die Werte in eine neue Matrix schreiben??
Hinzu kommt, dass das mehrmals hintereinander ausgeführt werden soll,die neu entstandenen Matrizen aber immer mit einem neuen Namen versehen werden, damit die erste Matrix nicht verloren geht.
Code:
[filename, pathname] = uigetfile('*.asc', 'Messdatei auswählen');
delimiter = ';'; % Trennzeichen innerhalb der Datei
row=4; % Anzahl der Zeilen, die beim einlesen ignoriert werden sollen
coloumn=2; % Anzahl der Spalten, die beim einlesen ignoriert werden sollen
M= dlmread(filename,delimiter,row,coloumn);
d=size(M); % Größe der Matrix M bestimmen, Zelienanzahl und Spaltenanzahl
zeile=d(1,1); % Zeilenanzahl
spalte=d(1,2); % Spaltenanzahl
% Schleife zum Auslesen der zeilen for k=1:end(length(zeile));
if k==0;
k=k+1;
end
%Schleife zum auslesen des Spaltenwertes
for l=1:end(lentgh(spalte));
if l==0;
l=l+1;
end
N(k,l)=M(zeile,spalte);
du möchtest also über jede Spalte einen Mittelwert bilden?
Warum genau stören dann die Einträge mit 0?
Eine Matrix mit teilweise leeren Stellen kann nicht erstellt werden. Entweder wäre also die Möglichkeit jede Spalte als einen eigenen Spaltenvektor zu extrahieren, oder du rechnest den Mittelwert mit den Nulleinträgen.
Für die Extraktion von Werten sollte z.B. sowas funktionieren:
Code:
M = dlmread([path, filename], delimeter, row, column);
B = M > 0; % B ist eine Matrix mit logischen Ausdrücken
N1 = M(B(:, 1), 1)% Extraktion der ersten Spalte aller Werte größer 0
Super,
Danke,
ist im Prinzip genau das was ich gesucht habe.
Allerdings muss ich dann die Zeile auch 33 mal schreiben oder?
Zitat:
N1 = M(B(:, 1), 1) % Extraktion der ersten Spalte aller Werte größer 0
Wenn ich das so eingebe wie du
Zitat:
M = dlmread([path, filename], delimeter, row, column);
mit [path,filename] dann kommt die Fehler
error using fopen
filename is too long
Error in dlmread
[fid,themessage])fopen(filename);
Macht es denn keinen Unterschied ob man über 500 Zeilen ohne 0 einen Mittelwert bildet oder über 600 Zeilen, wovon eben 100 Zeilen 0 enthalten?
Das würde die ganze Sache erheblich vereinfachen.(Ich nutze den mean Befehl)
Aber trotzdem Danke.
Über schleifen habe ich es noch nicht hinbekommen, da ja die Matrix immer weniger Zeilen enthält und die for-Schleife das nicht kapiert.
Angenommen ich muss das jetzt 100-mal hintereinander ausführen, wie bekommt man es dann hin, dass die entstehenden Matrizen immer einen neuen Namen zugewiesen bekommen?
Danke an dieses Forum, und allen die sich hier bemühen mir zu helfen.
ach entschuldige, natürlich macht es einen Unterschied, ob die Nullen in deine Rechnung eingehen oder nicht. Sie verfälschen natürlich das Ergebnis.
Ich hab mal eben einen kurzen Code geschrieben, der sehr viel eleganter ist, als ich ursprünglich im Sinn hatte.
Code:
[filename, path] = uigetfile('*.txt', 'Messdatei auswählen');
delimiter = ';'; % Trennzeichen innerhalb der Datei
row = 4; % Anzahl der Zeilen, die beim einlesen ignoriert werden sollen
column = 2; % Anzahl der Spalten, die beim einlesen ignoriert werden sollen
M = dlmread([path, filename], delimiter,row,column);
B = M > 0; % B ist eine Matrix mit logischen Ausdrücken [zeilen, spalten] = size(M); % Anzahl der Zeilen und Spalten in M
Mittel = zeros(1, spalten); % Speicherplatz vorbelegen, damit die Schleife schneller ist
for i=1:spalten
Mittel(i) = mean(M(B(:, i), i)); % Berechnung der Mittelwerte für alle Zellen ungleich 0 end
Damit erhälst du in der Variable "Mittel" einen Zeilenvektor, in dem der Mittelwert jeder Spalte von M steht. Nur bei den Spalten 28 - 32 gibt es Probleme, aber da sind ja sowieso nur Einträge mit -300 (sind das Temperaturmessungen? Dann war wahrscheinlich das TE nicht angeschlossen o.Ä.) Getestet hab ichs mit Messung1.
Du kannst die Mittelwertberechnung natürlich ganz leicht anpassen, wenn du statt mean z.B. median haben möchtest. Einfach statt mean median schreiben oder sonst was.
Noch ein Tipp zu deinem Code:
die if Abfragen sind nicht nötig, da du in der for-Schleife direkt i als 1 deklarierst, also wird die Bedingung i==0 nie erfüllt. Also völlig überflüßig
Falls du noch Schwierigkeiten mit meinem Vorschlag haben solltest, immer her damit.
Schönen Gruß
Nachtrag:
Ach ja, falls du direkt mehrere Dateien einlesen möchtest, ohne ständig auf "run" zu drücken und die nächste Datei auszuwählen, kannst du aus dem Vektor "Mittel" natürlich auch eine Matrix machen und dann für jede Datei z.B. eine Zeile anlegen. Vorausgesetzt alle Messungen haben gleich viele Spalten.
Danke für die Bemühungen.
ja es sind Temperaturen.
Aber wenn Nullen einen Unterschied beim Mittelwert bilden machen, dann macht es auch einen Unterschied wenn jede Spalte unterschiedlich viele Einträge hat. Das widerum lässt die Vergleichbarkeit nicht zu.
Daher war die vorherige Lösung im Prinzip besser, da dann die Zeilenanzahl der ausgefüllten Matrix überall gleich ist.
Und somit ist das Problem des Mehrfachen einlesen, nicht behoben.
bei der Vergleichbarkeit kommt es darauf an, welche Ansprüche du stellst.
Du kannst ja z.B. zwei Messungen vergleichen, wobei die erste Messung 100 Messungen enthält und die zweite nur 10 Messungen. Das Mittel könnte trotzdem ähnlich sein, da die erste Messung einfach eine höhere Auflösung hat, da mehr Messwerte (vorausgesetzt die Messzeit ist bei beiden gleich).
Du könntest also den Mittelwert ohne Nullen bilden, oder halt mit Nullen, abhängig davon, welchen Zeitraum du betrachtest bzw. wie die Messpunkte entstanden sind.
Wenn du wirklich jede Spalte separat abspeichern möchtest, könnte ich mir vorstellen das immer Spaltenweise auszulesen und in einer Datei abzuspeichern. Dann hast du zwar keine Variable direkt im Workspace, aber eine Werte-Datei, auf die du zugreifen kannst.
Hallo
Bezüglich der Vergleichbarkeit gebe ich dir recht. Jedoch ist es bei mir notwendig, dass meine Mittelwerte aus einer gleichen Anzahl von Werten gebildet werden.
Und da ich den ersten Vorschlag nun getestet habe( >100 Datensätze), und dieser nicht funktioniert ist mein Problem nicht gelöst.
Vielleicht kann mir jemand sagen, wie ich jedes Zeile einer Matrix prüfe ob eine 0 enthalten ist. Und ich eine neue Matrix erstellen möchte ab der Zeile in der keine 0 mehr vorhanden ist.
Die Spaltenanzahl ist immer gleich aber die Zeilenanzahl variiert stark.
for n=1:spalten
% sobald eine 0 in einer Zeile entdeckt wird, kann in die nächste Zeile gesprungen werden if M(m, n)==0 break;
end
end if n==spalten
zeilen0 = [zeilen0 1]; % Zeilen, die keine 0 enthalten sind ok end else
zeilen0 = [zeilen0 0]; % Zeilen, die irgendwo eine 0 enthalten end
an so etwas hatte ich gedacht aber es funktioniert nicht. Und ich bin leider nicht auf die Schliche gekommen warum.
Und ich habe in deinem Code einen kleinen Fehler entdeckt. in der zweiten if-Schleife ist ein "end" zu viel.
Es erscheint der Fehler:
Zitat:
Subscipts indices must either be real positive integers or logicals
hoppla, ja das if braucht natürlich kein eigenes end.
Wie gesagt, der Code war eher als niedergeschriebene Idee gedacht
Nimm folgende Änderung vor:
Die Variable zeilen0 als Boolean vordeklarieren und in der if-else Abfrage statt einer 1 und 0 reinzuschreiben, muss da ein true und false rein.
Am Ende dann noch den ersten Wert in zeilen0 abschneiden, da es die Vordeklaration ist.
Also..
Code:
zeilen0 = false;
... if n==spalten
zeilen0 = [zeilen0 true]; % Zeilen, die keine 0 enthalten sind ok else
zeilen0 = [zeilen0 false]; % Zeilen, die irgendwo eine 0 enthalten end ...
zeilen0 = zeilen0(2:length(zeilen0)); % ersten Wert abschneiden, wegen Vordeklaration
Der Code ist nun getestet und funktioniert bei mir.
Vergiss nicht die negativen Werte. Wenn du die auch nicht haben möchtest, weil es Fehlersignale sind, musst du den Code entsprechend erweitern
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.