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

 

frischling95

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.02.2014, 15:43     Titel: Mittelung
  Antworten mit Zitat      
Hey,

ich habe eine Matrix A mit den Dimension 500x200. Jetzt möchte ich gerne über die Zeilen (500) mitteln und zwar alle 24 Schritte. Ich arbeite noch nicht so lange in Matlab, drum bin ich mir nicht sicher, wie ich das ganze angehen soll. Probiert hab ich es mal so:

Code:

for i = 24:24:size(A,1)-24;
    m(i) = mean(A(i-23:i),200);
end
 


Die Spalte halt ich konstant bei 200 und die Werte in den Zeilen sollen gemittelt werden. Die Fehlermeldung die ich bekomme:

Code:

???  In an assignment  A(I) = B, the number of elements in B and
 I must be the same.

Error in ==>
    m(i) = mean(A(i-23:i),200);
 



Das ganze hab ich auch mit einem gleitendem Mittel probiert, da 500 nicht durch 24 teilbar ist.

Code:

n1=24;
%
 for j=25:500-24;
     og1=j+n1; %obere Grenze
     ug1=j-n1; %untere Grenze
     
     A_m(j-n1,1)=(1/(2*n1+1))*(sum(A(ug1:og1,200)));
 end
 


Auch in dieser Schleife passt irgendwas noch nicht, denn wenn ich es einzeln mache mit x = mean(A(1:24,200)) kommt ein andere Wert raus, wie in der Schleife berechnet wird.

Vielleicht kann mir einer weiterhelfen.
Danke.
bye. A


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 09.02.2014, 17:26     Titel:
  Antworten mit Zitat      
Hallo,

du hast die Klammern falsch gesetzt. Du meintest wohl:

Code:
for i = 24:24:size(A,1)-24;
    m(i) = mean(A(i-23:i,200));
end


Wenn du das für alle 200 Spalten machen willst, würde ich es so machen:
Code:
A = rand(500,200);
idxs = 24:24:size(A,1); % man muss hier nicht abschneiden
m = zeros(floor(size(A,1)/24), 200);
for i = 1:numel(idxs)
    m(i,:) = mean(A(idxs(i)-23:idxs(i),:)); % : statt 200 --> alle Zeilen
end


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.02.2014, 18:03     Titel:
  Antworten mit Zitat      
Danke. Bin gerade drauf gekommen, dass ich ein gleitendes Mittel brauche, um am Ende wieder eine 500x200 Matrix rauszubekommen.
Vielleicht kannst du mir da auch noch mal weiterhelfen.

LG.
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 09.02.2014, 18:31     Titel:
  Antworten mit Zitat      
Hallo,

wie soll die gleiche Länge erreicht werden? Für die untersten und oberen Daten sind ja keine Daten noch weiter oben oder unten vorhanden.

Grundsätzlich kann man hier filter verwenden. Siehe
Code:

für ein Beispiel, in dem über 5 Werte gemittelt wird.

Achtung: im Beispiel werden die ersten 4 Werte durch Auffüllen mit Nullen berechnet.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.02.2014, 23:05     Titel:
  Antworten mit Zitat      
hi,
danke, wusste gar nicht, dass es in Matlab Filter gibt.
Irgendwie versteh ich das Beispiel nicht so ganz.


Code:

filter(ones(1,windowSize)/windowSize,1,data)
 


Den 1. Teil mit ones versteh ich, dass ist zum Auffüllen des Vektors. Das könnte ich doch auch mit NaN-Werten machten

Code:

ones(1,windowSize)*nan
 


Aber warum dividiere ich dann durch windowSize? Bzw. was bedeutet 1?

Hoffentlich stell ich mich nicht gerade ganz doof an Shocked

LG.
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.02.2014, 11:20     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Den 1. Teil mit ones versteh ich, dass ist zum Auffüllen des Vektors.

Nein, ist es nicht.
Schau dir mal den Teil unter Algorithm an.
Mit a = 1 wird der Filter zu einem gleitenden Mittelwert.
b sind dann die Gewichte für den Mittelwert. Wenn du also gleichmäßig über drei Werte mitteln willst, wäre das [1/3 1/3 1/3], oder allgemeiner eben
Code:
ones(1,windowSize)/windowSize


Es bleibt immer noch die Frage, die ich zuvor gestellt hatte:
Zitat:
wie soll die gleiche Länge erreicht werden? Für die untersten und oberen Daten sind ja keine Daten noch weiter oben oder unten vorhanden.


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.02.2014, 13:38     Titel:
  Antworten mit Zitat      
ah okay danke.
Wenn ich also über 24 Werte mitteln möchte ist windowsize = 24.

die gleiche länge, hätte ich durch auffüllen mit NaN-Werte gemacht, also am Anfang des Vektors und am Ende, damit wieder ein Vektor mit der Länge 500 rauskommt.

LG.
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.02.2014, 14:03     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
die gleiche länge, hätte ich durch auffüllen mit NaN-Werte gemacht, also am Anfang des Vektors und am Ende, damit wieder ein Vektor mit der Länge 500 rauskommt.

Dann kommt zunächst ein längerer Vektor (bzw. eine Matrix mit mehr Zeilen) heraus, aus dem du dann die richtigen Einträge herausholen musst.
Geschickter wäre:
Code:
A = ones(500, 20);
Amean = filter(ones(1,24)/24, 1, A);
Amean(1:23, :) = NaN;


oder je nach Interpretationsweise, ob der Mittelwerte symmetrisch oder nachlaufend sein soll, etwas der Form
Code:
A = ones(500, 20);
Amean = filter(ones(1,24)/24, 1, A);
Amean = [nan(11,20); Amean(24:end, :); nan(12,20)];


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.02.2014, 16:52     Titel:
  Antworten mit Zitat      
hallo,

danke. jetzt hab ich es mit der zweiten varianten probiert, wenn ich aber nur die erste Amean zeile durchlaufen lasse bekomme ich am Ende einen Vektor mit der gleichen Länge, ohne, dass ich mit nan-Werten auffüllen musste.

LG.
 
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.