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

Matrix auslesen un in neue Matrix schreiben

 

josye
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 26.03.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.05.2014, 14:30     Titel: Matrix auslesen un in neue Matrix schreiben
  Antworten mit Zitat      
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);
 


Ich habe wirklich keine Ahnung wie man da etwas bewerkstelligen könnte.


Vielen Dank für eure Hilfe

Grüße

Josye

Messung4.txt
 Beschreibung:

Download
 Dateiname:  Messung4.txt
 Dateigröße:  169.37 KB
 Heruntergeladen:  596 mal
Messung3.txt
 Beschreibung:

Download
 Dateiname:  Messung3.txt
 Dateigröße:  167.95 KB
 Heruntergeladen:  599 mal
Messung2.txt
 Beschreibung:

Download
 Dateiname:  Messung2.txt
 Dateigröße:  174.15 KB
 Heruntergeladen:  591 mal
Messung1.txt
 Beschreibung:

Download
 Dateiname:  Messung1.txt
 Dateigröße:  170.58 KB
 Heruntergeladen:  598 mal
Private Nachricht senden Benutzer-Profile anzeigen


TurboUlli
Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 26.05.14
Wohnort: NRW
Version: 2014a
     Beitrag Verfasst am: 26.05.2014, 12:04     Titel:
  Antworten mit Zitat      
Hi josye,

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
 
Private Nachricht senden Benutzer-Profile anzeigen
 
josye
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 26.03.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.05.2014, 18:05     Titel:
  Antworten mit Zitat      
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.

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
TurboUlli
Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 26.05.14
Wohnort: NRW
Version: 2014a
     Beitrag Verfasst am: 26.05.2014, 22:13     Titel:
  Antworten mit Zitat      
Hi,

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 Wink

Falls du noch Schwierigkeiten mit meinem Vorschlag haben solltest, immer her damit. Smile

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.
Private Nachricht senden Benutzer-Profile anzeigen
 
josye
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 26.03.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.05.2014, 08:29     Titel:
  Antworten mit Zitat      
Hey,

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.

Ich werde mal schauen was ich machen kann.

Danke und schönen Tag
Private Nachricht senden Benutzer-Profile anzeigen
 
TurboUlli
Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 26.05.14
Wohnort: NRW
Version: 2014a
     Beitrag Verfasst am: 27.05.2014, 08:35     Titel:
  Antworten mit Zitat      
Hi,

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.
Private Nachricht senden Benutzer-Profile anzeigen
 
josye
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 26.03.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.05.2014, 08:12     Titel:
  Antworten mit Zitat      
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.

Danke

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
TurboUlli
Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 26.05.14
Wohnort: NRW
Version: 2014a
     Beitrag Verfasst am: 28.05.2014, 08:48     Titel:
  Antworten mit Zitat      
Hi,

hm spontan fällt mir leider keine Funktion ein, die das elegant löst.
Aber mit Schleifen und logischen Ausdrücken dürfte das auch machbar sein.

z.B.:

Code:
[zeilen, spalten] = size(M);

for m=1:zeilen
   
   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
     
end

N = M(zeilen0, :);      % die Matrix N enthält nur Zeilen von M, die keine 0 enthalten


Ich habe den Code nicht getestet, aber das wäre meine Idee dazu Zeilen ohne 0 zu extrahieren.
Private Nachricht senden Benutzer-Profile anzeigen
 
josye
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 26.03.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.05.2014, 14:51     Titel:
  Antworten mit Zitat      
Hey

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

Error in line ... N=M(zeilen0, : )


Da weiß ich nicht mehr weiter.

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
TurboUlli
Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 26.05.14
Wohnort: NRW
Version: 2014a
     Beitrag Verfasst am: 28.05.2014, 15:06     Titel:
  Antworten mit Zitat      
Hi,

hoppla, ja das if braucht natürlich kein eigenes end.
Wie gesagt, der Code war eher als niedergeschriebene Idee gedacht Wink

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 Wink
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 - 2024 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.