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 einer Matrix ohne Nullen

 

Becks
Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 24.04.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.07.2011, 19:24     Titel: Mittelwerte einer Matrix ohne Nullen
  Antworten mit Zitat      
Hallo,

bin leider immer noch nicht ganz so fit in Matlab^^.

Ich habe 1000 64x64 Matrizen. Die Werte der Matrizen entsprechen Geschwindigkeiten einer Messung.
Mittelwert von diesen 1000 Matrizen bilden habe ich hinbekommen mit einer schleife. Jedoch befinden sich an manchen Stellen in manchen Matrizen Nullen. Diese Nullen sind Messfehler und verfälschen meine Mittelwerte.
Wie bekomme ich es hin, dass diese Nullen nicht mit gezählt werden? Ich denke mal über eine if Bedingung? Das aufaddierte Ergebnis soll dann natürlich auch nur durch die Anzahl der aufadierten Werte geteilt werden.

Danke im Voraus.
Gruß, Becks.


€: Hab grad über die Suche gefunden das man hier mit die Nullen aus dem Vektor entfernen kann.

Code:


>> a = [1 2 3 0 5 0 3 9 0 0 5 6];
>> a = a(a~=0)

a =

     1     2     3     5     3     9     5     6

 


Wenn ich das aber auf die Matrix anwende, listet er mir alle Werte in einer Spalte auf.

Zuletzt bearbeitet von Becks am 19.07.2011, 19:45, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen


DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 19.07.2011, 19:42     Titel:
  Antworten mit Zitat      
Müsste so gehen...

Code:

% Matrix A(64:64)
% Mittelwert ohne Nullen berechnen
mw = mean(A(A(:)>0));
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Becks
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 24.04.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.07.2011, 19:51     Titel:
  Antworten mit Zitat      
Danke schonmal für die Hilfe.
Aber ich möchte nicht den Mittelwert einer einzelnen Matrix bestimmen sondern die 1000 Matrizen aufadieren, so dass ich am Ende eine Mittelwert Matrix habe.
Problem ist jedoch das ich die aufadierte Matrix nicht durch 1000 teilen kann weil an manchen Stellen in manchen Matrizen Nullen auftauchen, die nicht mit addiert werden sollen. Und ich weiss auch nicht wie ich die Nullen nicht mitzählen soll.

Hoffe das ist halbwegs verständlich^^.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

eine Möglichkeit wäre, die Nullen durch NaN zu ersetzen und dann NANMEAN bzw. NANSUM zu verwenden.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 24.04.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.07.2011, 20:38     Titel:
  Antworten mit Zitat      
Mit NANSUM kann ich ja leider keine Matrizen aufsummieren.
Private Nachricht senden Benutzer-Profile anzeigen
 
Becks
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 24.04.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.07.2011, 21:13     Titel:
  Antworten mit Zitat      
Habs mit ein paar schleifen geschafft.
Nochmal danke für die Hilfe. Echt super wie schnell geantwortet wird!
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 19.07.2011, 21:20     Titel:
  Antworten mit Zitat      
Wenn du die Matrizen schon in einer Schleife aufsummierst, kannst du doch auch gleich noch die Nullen in jeder Matrix zählen

Code:

anz_null_alt = 0;
sum_Matrix(64:64) = 0;
for ...
   % summieren
   sum_Matrix = sum_Matrix + A;
   nullen = A(A(:)==0); % Nullen finden
   anz_null_neu = length(nullen); % Anzahl Nullen in der Matrix
   anz_null_alt = anz_null_alt + anz_null_neu; % aufsummieren
end
 


Jetzt ziehst du anz_null_alt von der Gesamtanzahl der Element ab und kannst diesen Wert für die Mittelung nehmen. Die Nullen können doch ruhig in der Matrix bleiben, da sie ja an der Summe nichts ändern.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

natürlich geht das. Matrizen in einer 3D-Matrix hintereinander anordnen, und dann Mittelwert entlang der 3. Dimension:

Code:
M = rand(64,64,1000);
mittel = mean(M, 3);


... entsprechend auch für SUM oder NAN*, wie man will.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 24.04.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.07.2011, 12:22     Titel:
  Antworten mit Zitat      
Hallo Harald,

ok das wusste ich nicht. Das funktioniert natürlich auch alles viel besser und schneller als die hintereinander verschachtelten schleifen die ich hatte.
Vielen Dank!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.07.2011, 12:38     Titel:
  Antworten mit Zitat      
Immer gerne Smile

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 24.04.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.07.2011, 16:47     Titel:
  Antworten mit Zitat      
Eine Frage habe ich doch noch.
Ich versuche grade die Standardabweichung zu bestimmen.
Über die Formel: rms = sprt[(1/(n-1)) * summe(u(i) - umittel)]

Mein Problem ist, dass sich mein "n" pro Matrixelement ändern kann aufgrund der nullen die nicht mitgezählt werden.

Ich hab die Nullen in meiner 3D matrix gleich NaN gesetzt und dann versucht über length zu bestimmen wie viele Werte übrig bleiben für jedes element der 64x64 matrizen. Klappt aber nicht so ganz.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

auch hier würde ich die gleiche Strategie und NANSTD verwenden.

Und: was genau klappt nicht? Was hast du versucht? Je konkreter die Fragen und die Problembeschreibung sind, desto leichter kann man auch helfen.

length ändert sich durch NaN nicht. Für das gewünschte könnte z.B. auch NNZ helfen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 24.04.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.07.2011, 20:18     Titel:
  Antworten mit Zitat      
Ok, das length sich durch NaN nicht ändert erklärt schonmal, dass es bei mir nicht funktioniert hat.

Habe es jetzt hiermit versucht.
Code:


rms = nanstd(u, 3);

 



"u" ist meine 3D matrix. Jedoch kriege ich eine Fehlermeldung:

Code:

??? Error using ==> nanvar at 68
The length of W must be compatible with X.

Error in ==> nanstd at 28
y = sqrt(nanvar(varargin{:}));
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

ich habe eben einen Blick in die Doku geworfen (was du übrigens auch hättest machen können Wink ) und festgestellt, dass die Syntax von NANSTD leicht anders ist. Zulässig ist:

Code:
rms = nanstd(u, 0, 3);
rms = nanstd(u, 1, 3);


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 24.04.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.07.2011, 11:20     Titel:
  Antworten mit Zitat      
Ja, die Hilfe option bei Matlab sollte ich öfters mal benutzen.
Soweit klappt jetzt alles.
Nochmal danke.
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.