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

mittelung einer matrix, aber nur über die zeilen

 

himb666

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.03.2014, 17:24     Titel: mittelung einer matrix, aber nur über die zeilen
  Antworten mit Zitat      
Hallo liebe community,

ich habe eine 89x36 große Matrix, wobei in den zeilen (89) die Entfernung und in den spalten (36) die Höhe der Druck-Werte steht. Diese Matrix möchte ich jetzt Mitteln, jedoch nur über die Entfernung und anschließend mit den Finiten Differenzen eine neue Variable bestimmen.

Probiert hab ich das mal so:

Code:

%Mittelung über die Entfernung
p_mean= filter(ones(1,12)/12,1,p);

% finite Differenz
 for i = 1:size(p_mean,1)-1;
     for m = 1:size(p_mean,2);
         r1 = i;
         r2 = (i+1);
         dp(i,m) = (p_mean(r2,m)-p_mean(r1,m))/(2*(r2-r1));
     end
 end
 


Der Code läuft soweit ohne Fehlermeldung durch, nur bin ich mir ziemlich unsicher, ob das so stimmt (ich arbeite noch nicht so lange mit Matlab und bin überhaupt ganz überrascht, dass es ohne Fehler durchläuft.)

Da ich ja nur über die Entfernung mitteln möchte, habe ich mich entschieden, einen 1D Filter zur Mittelung zu verwenden. Mittelt Matlab jetzt die Entfernung für jede einzelne Höhe, also wenn ich jetzt sage p(:,2) gibt mir ja Matlab alle Werte auf der Höhe 2 aus, sind das dann schon die gemittelten Entfernungs-Werte?

Bei der berechnung der finiten Differenzen hab ich die gleiche Frage. Ich möchte dp ebenfalls für jede höhe berechnen, also dass ich am Ende wieder mit zB. dp(:,Cool wählen kann, welche höhe ich mir anschauen will.

Vielleicht kann mal einer von euch über den code drüber schauen, und mir ev. Tipps geben, falls ich das falsch verstehe. wär voll nett Smile

Schönen Tag noch.


Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 04.03.2014, 17:57     Titel:
  Antworten mit Zitat      
Wenn ich nur die Überschrift und den ersten Satz lese, dann glaube ich die Frage zu verstehen. Dann lautet meine Antwort:

Code:

a=rand(4,5)
mean(a,1)
mean(a,2)
 


So kann man mitteln und mal in die eine und mal in die anderer Richtung.

Die Zusatzinformationen verwirren ich aber Wink

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 04.03.2014, 18:07     Titel:
  Antworten mit Zitat      
Hallo,

das, was du mit der filter()-funktion machst, ist ein Moving Average Filter über deine Zeilen. Die erste Zeile von p_mean hängt dann von den Werten der ersten Zeile von p ab. Wenn du das haben möchtest, dann ist das grundsätzlich schon mal richtig. Falls du das über die Spalten haben möchtest, dann kannst du die Dimension noch zusätzlich angeben
Code:
p_mean= filter(ones(1,12)/12,1,p,[],2);


Aber Achtung, mit filter() wird Zeropadding gemacht. Das heißt der erste Wert, der ausgesuckt wird, ist das Mittel aus 11 Nullen und dem ersten Wert in der Zeile (respektive Spalte). Das ist vielleicht nicht wirklich das, was du willst. Schau dir beispielsweise das hier an:
Code:
plot(p(:,1),'k-'), hold on
plot(p_mean(:,1),'r-')
 

Je nach Werten für p wirst du eventuell überrascht sein.

Zitat:
..., also wenn ich jetzt sage p(:,2) gibt mir ja Matlab alle Werte auf der Höhe 2 aus, sind das dann schon die gemittelten Entfernungs-Werte?

Nein, in p stehen weiterhin deine usprünglichen Daten, die mit dem gleitenden Mittel erstellten Daten stehen in p_mean.

Ansonsten ist mir nicht ganz klar, was du möchtest.
Viele Grüße,
Nras.



EDIT:
Die For-Schleifen solltest du dir auch sparen können:
Code:
dp = (p_mean(2:end,:) - p_mean(1:end-1,:))/2
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.03.2014, 18:45     Titel:
  Antworten mit Zitat      
Hallo Nras,

danke für deine Antwort.

Okay, versteh ich das richtig. p_mean(:,1) enthält dann die gemittelten Werte von p(:,1), p_mean(:,2) die gemittelten Werte von p(:,2) usw. ?

Das war mir gar nicht bewusst, wenn ich die filter() funktion anwende, gibts eine möglichkeit das Zeropadding irgendwie zu umgehen?

Für die finiten Differenzen möchte ich, die gemittelten druck-werte für die Berechnung dp herangezogen werden und das auch wieder so, dass dp aus p_mean(:,1) berechnet wird, dann aus p_mean(:,2) usw. Da bin ich mir nicht sicher, ob ich die zweite for-schleifen über die spalten richtig gesetzt habe.

lg.
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 04.03.2014, 19:44     Titel:
  Antworten mit Zitat      
Zitat:
Okay, versteh ich das richtig. p_mean(:,1) enthält dann die gemittelten Werte von p(:,1), p_mean(:,2) die gemittelten Werte von p(:,2) usw. ?


Nein. Das eine mittelt über die Spalten, das andere über die Zeilen.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.03.2014, 19:20     Titel:
  Antworten mit Zitat      
Hallo,

das mit der Mittelung versteh ich jetzt. Wie kann ich das angesprochene Zeropadding vermeiden? Gibts da eine andere Möglichkeit ein gleitendes Mittel zu machen?

LG.
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 06.03.2014, 10:22     Titel:
  Antworten mit Zitat      
Hallo,

also wenn du über 12 Werte mitteln willst, muss irgendwie klar sein, was am Rand passieren soll. Bei filter() ist y(n) = mean(x(n-12+1:n)). Das macht am linken Rand Probleme, da man dort nicht 11 Nachbarn zur Linken verfügbar hat. Das wird dann mit Nullen aufgefüllt (Zeropadding).
Das gibt beispielsweise für einen moving average Filter mit Fensterbreite 5:
Code:
y(1) = mean([0,0,0,0,x(1)]);
y(2) = mean([0,0,0,x(1),x(2)]); usw.
 


Eine Alternative ist, sich soetwas selbst zu schreiben und dann am Rand die Fensterbreite zu verkleinern. Sozusagen wäre dann
Code:
y(1) = mean(x(1));
y(2) = mean(x(1:2));
y(3) = mean(x(1:3));
y(4) = mean(x(1:4));
y(5) = mean(x(1:5));
y(6) = mean(x(2:6));
y(7) = mean(x(3:7));
 
und so weiter...
Das kann man auch effektiver programmieren, aber um das auf die Schnelle selbst zu erstellen, sollte das schon mal ein hilfreiches Muster sein.

Viele Grüße,
Nras.
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 - 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.