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

Mittelwerte einzelner Matrixelemente aus mehreren Matrizen

 

peter.krumov

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.06.2012, 00:35     Titel: Mittelwerte einzelner Matrixelemente aus mehreren Matrizen
  Antworten mit Zitat      
Hallo zusammen,

ich habe meine Messdaten in 49 Matrizen der Größe [480x640] geladen. Nun würde ich gern die Mittelwerte über diese 49 Datensätze bilden und zwar elementenweise und das Ergebnis als neue Matrix ausgeben lassen. Den Mittelwert aus zwei [3x3] Matrizen bekomme ich ja noch hin, aber ich habe nur leider keine Ahnung, wie ich das bei so vielen Elementen schaffen soll?

Für einen Denkanstoß wäre ich sehr dankbar.
Peter


Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 11.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.06.2012, 07:37     Titel:
  Antworten mit Zitat      
Hallo Peter,

wie hast Du Deine 49 Matrizen im Speicher? Am besten als ein 480x640x49-Matrix,
dann läßt sich der Mittelwert einfach über
Code:
mittelwert=mean(messdaten,3);

berechenen.

Grüße
Sirius
Private Nachricht senden Benutzer-Profile anzeigen
 
peter.krumov

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.06.2012, 16:23     Titel:
  Antworten mit Zitat      
Ah vielen Dank! Bei einem einfachen Beispiel funktioniert das wunderbar.
Ich habe meine Matrizen einzeln gespeichert. Nun versuche ich sie zu einer Matrix zusammenzufassen und benutze dabei eine for-Schleife. Leider bricht die Schleife irgendwann ab mit der Meldung:
??? Out of memory.
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 11.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.06.2012, 09:28     Titel:
  Antworten mit Zitat      
Hallo Peter,

wie sieht Deine Schleife aus?
Woher kommen die Einzelmatrizen?
Wenn die Einzematrizen in einer cell gespeichert sind:
Code:
alleszusammen =  cat(3, einzeln{:});

Dann verbraucht das nur den doppelten Speicher.
Wenn deine Zahlen vom ersten Posting noch stimmen,
sind das 234 MB mehr, sollte also kein Speicherproblem geben.

Grüße
Sirius
Private Nachricht senden Benutzer-Profile anzeigen
 
peter.krumov

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.06.2012, 16:43     Titel:
  Antworten mit Zitat      
Hallo, meine Messwerte habe ich alle in einer eigenen Matrix gespeichert, sodass ich 50 Matrizen A00 bis A49 habe. (Es sind 50, nicht 49 Wink )
Nun habe ich versucht, alle A-Matizen in die dreidimensionale Matrix C zu packen. Dies gelingt aber nur bei maximal 40 Matrizen, ansonsten tritt das Memory-Problem auf.
Ich dachte schon, die Operationen sind für eine Schleife zuviel, deswegen habe ich drei Schleifen daraus gemacht. Das hat aber leider nichts geholfen.
Den "cat"-Befehl kannte ich noch gar nicht. Funktioniert wunderbar, vielen Dank für den Tipp! Aber gibt es hier nicht auch die Möglichkeit, die Werte aus den A-Matrizen über eine Schleife aufzurufen? Sonst ist es ja viel Aufwand mit dem Eintippen.

Anbei mein Code, viele Grüße, Peter.

Code:
clear all
clc

%Dateipfad!
dirname = cd('\\vstor2\pcpool\j8sp0631\Desktop\Masterarbeit\Messungen\060612\Stufe3_Hand');

%Anzahl der Kopfzeilen vor den eigentlichen Messwerten angeben!
headlines = 9;


%  function comma2point(Datei):
%  Generate a new file named Oldfilename_Modified.ending. In the new File all
%  ',' are changed to '.' Needs a full datapath and filename as input.

%Einlesen aller Dateien über variablen Datei-Namen.

for i=0:1:49

   Datei = ['irdata_' [repmat('0',1,...
             2-length(num2str(i))) num2str(i)] '.txt'];
   
    %Ersetzt ',' durch '.'
    Name=textscan(Datei,'%s%s','delimiter','.');
    NewFile=strcat(Name{1}, '_mod.',Name{2});
    copyfile(Datei, NewFile{1});
    file    = memmapfile(NewFile{1},'Writable',true);
    comma   = uint8(',');
    point   = uint8('.');
    file.Data(( file.Data==comma)' ) = point;


% A = importdata(filename, delimiter, nheaderlines) loads data from ASCII file filename, reading numeric data starting from line nheaderlines+1.
%Einlesen der mod. Daten
%Ausgabe in Matrizen A00-A49
 
Datei = ['irdata_' [repmat('0',1,...
             2-length(num2str(i))) num2str(i)] '_mod.txt'];
   
%Matrix A [480x640] enthält Messwerte!

val_1 = importdata(Datei,'',headlines);
[val_1,delimiter,nheaderlines]=importdata(Datei);
% assignin ('base',['B' [repmat('0',1,...
%              2-length(num2str(i))) num2str(i)]], val_1);


[val_2] = val_1.data;
assignin ('base',['A' [repmat('0',1,...
             2-length(num2str(i))) num2str(i)]], val_2);


end

for k=0:1:39
   
C(:,:,(k+1)) = evalin('base',sprintf(['A' [repmat('0',1,...
             2-length(num2str(k))) num2str(k)]]));
   
end


Mittel = mean(C,3);
M1 = flipud(Mittel);

save('Mittelwerte.txt','M1','-ascii');
 
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 09.06.2012, 22:22     Titel:
  Antworten mit Zitat      
Hallo peter.krumov,

Die Methode, einen Satz von Variablen A00 bis A49 zu erzeugen, sollte man vermeiden, siehe: http://matlab.wikia.com/wiki/FAQ#Ho.....2C....2CA10_in_a_loop.3F[. Der Umweg, die Variablen dann noch per EVALIN('base') im Base-Workspace zu erzeugen, ist auch gruselig. Die Speicherung in einem normalen Areray im lokalen Workspace wäre viel effizienter und übersichtlicher.
Das Array C wäcsht in jeder Iteration an. Dies benötigt für jede Iteration ein neues, größeres Array und ein Kopieren des vorherigen. Matlab braucht dann nicht 640*480*50 doubles, sondern 640*480 + 640*480*2 + 640*480*3 + ...
640*480*50. Das macht 640*480*sum(1:50)*8 bytes = 3.13 GByte.

Lösungen:
1. Pre-allocation
2. A{1}, A{2}, ... statt A1, A2, ...
3. Oder besser Werte gleich ins C-Array schreiben:

Code:
...
C = zeros(480, 640, 50);   % Pre-allocate!

for i = 0:49
  ...
  val_2 = val_1.data;
  C(:, :, k+1) = val_2;
end

Mittel = mean(C,3);
 

Auf "clear('all')" würde ich mal verzichten - bei Bedarf findest Du dazu einiges im Forum.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
peter.krumov

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.06.2012, 16:08     Titel:
  Antworten mit Zitat      
Vielen Dank für die Hinweise, jetzt läuft alles wie gewünscht! Very Happy
Mit pre-allocation kannte ich mich noch gar nicht aus. So geht es natürlich viel besser.

Eine Frage habe ich noch: Kann ich mir innerhalb eines Contour-Plots die Koordinaten jeden Pixels anzeigen lassen?
Ich kenne das mittels 'imshow' und 'impixelinfo', nur leider braucht man dafür ja ein bmp-Bild. Wenn ich meinen Datenplot als bmp speichere, sind es danach natürlich viel mehr Pixel als Werte im Datensatz [640*480].
 
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.