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

Mittelwert für gleiche 2. Spalte

 

svn88
Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 14.07.10
Wohnort: ---
Version: 7.6.0 (R2008a)
     Beitrag Verfasst am: 19.08.2010, 22:58     Titel: Mittelwert für gleiche 2. Spalte
  Antworten mit Zitat      
Hallo,

bin neu hier und kenne mich noch nicht so gut mit Matlab aus.
Würde mich sehr freuen wenn mir jemand helfen kann.

Ich habe folgende Matrix:


-69 0
-72 0
-88 0
-70 0
-63 0
-58 10
-56 10
-59 20
-58 20
-59 20

und würde gern jeweils den Mittelwert für die gleichen Werte der 2. Spalte (0, 10, 20 ) bilden.

Hat jemand eine Idee ?

Schonmal vielen vielen Dank im Vorraus.
Private Nachricht senden Benutzer-Profile anzeigen


Vito
Forum-Guru

Forum-Guru


Beiträge: 315
Anmeldedatum: 02.11.09
Wohnort: Stuttgart
Version: ---
     Beitrag Verfasst am: 19.08.2010, 23:48     Titel:
  Antworten mit Zitat      
Hi,

wenn ich dich recht verstanden habe, dann willst du den Mittelwert der zweiten Spalte deines Matrix bilden und das machst du so:
Code:

Mat =

   -69     0
   -72     0
   -88     0
   -70     0
   -63     0
   -58    10
   -56    10
   -59    20
   -58    20
   -59    20

Mittelwert = mean(Mat(:,2))

Mittelwert =

     8
 


Gruß,
Vito
Private Nachricht senden Benutzer-Profile anzeigen
 
svn88
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 14.07.10
Wohnort: ---
Version: 7.6.0 (R2008a)
     Beitrag Verfasst am: 20.08.2010, 00:45     Titel:
  Antworten mit Zitat      
Hi,

danke für die Antwort, meinte aber etwas anderes.

Hab mich wohl etwas ungünstig ausgedrückt, sorry.
Ich will den Mittelwert der 1. Spalte für die gleichen Wert der 2. Spalte berechen

also einmal den Mittelwert

-69-72-88-70-63 (2.Spalte = 0)

sowie für

-58-56 (2.Spalte = 10)

und

-59-58-59 (2.Spalte = 20)

Die Tabelle ist auch nur ein kleiner Ausschnitt, von daher wäre eine automatisierte Funktion, die die 2. Spalte auf gleiche Werte prüft und dann den Mittelwert der zugehörigen Daten der 1. Spalte bildet ideal.

Weiß jemand wie das geht ?

Vielen Dank schonmal im Vorraus
Private Nachricht senden Benutzer-Profile anzeigen
 
Vito
Forum-Guru

Forum-Guru


Beiträge: 315
Anmeldedatum: 02.11.09
Wohnort: Stuttgart
Version: ---
     Beitrag Verfasst am: 20.08.2010, 07:29     Titel:
  Antworten mit Zitat      
Hi,

das geht auch fast so Wink
Code:

Nullen = find(Mat(:,2)==0); % hier werden alle indizes bestimmt mit Nullen
Zehner = find(Mat(:,2)==10); % s.o.
Zwanziger=find(Mat(:,2)==20);% s.o.
MittelwertNullen = mean(Mat([Nullen(1):Nullen(end)],1));
MittelwertZehner = mean(Mat([Zehner(1):Zehner(end)],1));
MittelwertZwanziger = mean(Mat([Zwanziger(1):Zwanziger(end)],1));

MittelwertNullen =

  -72.4000

MittelwertZehner

   -57

MittelwertZwanziger =

  -58.6667
 

Gruß,
Vito
Private Nachricht senden Benutzer-Profile anzeigen
 
Fourier
Forum-Guru

Forum-Guru


Beiträge: 329
Anmeldedatum: 05.04.10
Wohnort: Karlsruhe
Version: 2009b
     Beitrag Verfasst am: 20.08.2010, 08:34     Titel:
  Antworten mit Zitat      
Hallo,

für einen beliebig langen Vektor A kannst du das auch probieren.
die forschleife lässt sich vlt vermeiden, aber manchmal ist sie auch praktisch ;).

Code:

u=unique(A(:,2));
len=length(u);

% Variante 1 (die würde ich nehmen)
% sieht nicht gut aus, aber schön und sicher
% Ergebnisse stehen als eine Struktur M  (M.mittel0, M.mittel10,...)

for i=1:1:len
    x=find(A(:,2)==u(i));
    M.(sprintf('mittel%d',u(i)))=mean(A(x,1));
end

% Variante 2
% sieht gut aus aber nicht schön und unsicher
% Ergebnisse mittel0, mittel10, mittel20

for i=1:1:len
    x=find(A(:,2)==u(i));
    eval(['mittel' num2str(u(i)) '=' num2str(mean(A(x,1)))])
end
 


gruss
_________________

Ein schlechter General ist besser als zwei gute.
Private Nachricht senden Benutzer-Profile anzeigen
 
Maddy
Ehrenmitglied

Ehrenmitglied



Beiträge: 494
Anmeldedatum: 02.10.08
Wohnort: Greifswald
Version: ---
     Beitrag Verfasst am: 20.08.2010, 08:52     Titel:
  Antworten mit Zitat      
Ich denke, dem Threadersteller reicht auch eine Matrix:

Code:

Mat=[ -69     0
   -72     0
   -88     0
   -70     0
   -63     0
   -58    10
   -56    10
   -59    20
   -58    20
   -59    20];

element=unique(Mat(:,2));
s=length(element);
res=zeros(s,2);

for k=1:s;
    res(k,2)=element(k);
    h=find(Mat(:,2)==element(k));
    res(k,1)=mean(Mat(h,1));
end

disp(res)


Schleifenlos wäre viel schöner, aber dafür ist es jetzt noch zu früh am Morgen. Very Happy

PS: Die Ordnung der Dinge ist wieder hergestellt, der "Fourier" war wieder "fast" Wink
_________________

>> why
The computer did it.

Zuletzt bearbeitet von Maddy am 20.08.2010, 09:07, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Fourier
Forum-Guru

Forum-Guru


Beiträge: 329
Anmeldedatum: 05.04.10
Wohnort: Karlsruhe
Version: 2009b
     Beitrag Verfasst am: 20.08.2010, 09:04     Titel:
  Antworten mit Zitat      
Zitat:

dem Threadersteller reicht auch eine Matrix:


jaa ist eigentlich immer das beste.

ich hab am anfang an einem vektor gedacht, dann dachte ich wieder woher soll er wissen welcher mittelwert zu was gehört. aber auf eine Matrix
bin ich gekommen Rolling Eyes
Zitat:

Die Ordnung der Dinge ist wieder hergestellt, der "Fourier" war wieder "fast"


es war wohl zuu "fast" Laughing
_________________

Ein schlechter General ist besser als zwei gute.
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 20.08.2010, 10:09     Titel:
  Antworten mit Zitat      
Hallo
hier noch 2 Möglichkeiten, aber für große Datenmengen, ist FOR günstiger

1) Versteckte FOR, braucht mehr Speicher wg Anonymen Funktion
Code:

M =[
   -69     0
   -72     0
   -88     0
   -70     0
   -63     0
   -58    10
   -56    10
   -59    20
   -58    20
   -59    20];

arrayfun(@(x)mean(M(M(:,2)==x,1)), unique(M(:,2)))
 



2) BSXFUN ist auch in sich eine Schleife, weil komponentenweise operationen
Code:


M =[
   -69     0
   -72     0
   -88     0
   -70     0
   -63     0
   -58    10
   -56    10
   -59    20
   -58    20
   -59    20];
B = bsxfun(@eq,unique(M(:,2))',M(:,2));
B = bsxfun(@times,B,M(:,1));
mean(B)*size(B,1)./(sum(B~=0))
 
Private Nachricht senden Benutzer-Profile anzeigen
 
svn88
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 14.07.10
Wohnort: ---
Version: 7.6.0 (R2008a)
     Beitrag Verfasst am: 20.08.2010, 15:34     Titel:
  Antworten mit Zitat      
Wow,

so schnell so viele Antworten. Vielen Dank.


Hab gerade mal alle Variationen durchprobiert. Für mich ist die 3. Version (Maddy) optimal, mit

Code:

plot(res(1:23,2),res(1:23,1));figure


wird exakt das angezeigt, was angezeigt werden soll; 1A!

Gibt es hier evtl. noch die Möglichkeit den plot-Befehl so abzuwandeln, dass er nicht die Zeilenanzahl der Matrix (hier 23) enthalten muss, sondern diese automatisch feststellt?

Nochmals vielen Dank im Vorraus.
Private Nachricht senden Benutzer-Profile anzeigen
 
Maddy
Ehrenmitglied

Ehrenmitglied



Beiträge: 494
Anmeldedatum: 02.10.08
Wohnort: Greifswald
Version: ---
     Beitrag Verfasst am: 20.08.2010, 18:08     Titel:
  Antworten mit Zitat      
Wenn du den ganzen "Vektor" plotten willst, dann:

Code:

plot(res(:,1),res(:,2))

_________________

>> why
The computer did it.
Private Nachricht senden Benutzer-Profile anzeigen
 
svn88
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 14.07.10
Wohnort: ---
Version: 7.6.0 (R2008a)
     Beitrag Verfasst am: 20.08.2010, 21:19     Titel:
  Antworten mit Zitat      
Hi Maddy,

vielen Dank für den Lösungsvorschlag. Leider funktioniert es nicht wenn ich mehrere plots von Vektoren in eine figure machen will, zum Beispiel bei:

Code:

plot(M1(1:16,2),M1(1:16,1),'Marker','diamond','DisplayName','1.Messung'); figure(1)
plot(M2(1:24,2),M2(1:24,1),'Marker','x','DisplayName','2.Messung'); figure(1)
plot(M3(1:22,2),M2(1:22,1),'Marker','*','DisplayName','3.Messung'); figure(1)
plot(M4(1:15,2),M2(1:15,1),'Marker','o','DisplayName','4.Messung'); figure(1)
plot(M5(1:24,2),M5(1:24,1),'Marker','+','DisplayName','5.Messung'); figure(1)
 


erscheint bei der Version mit dem ganzen Vektor die Fehlermeldung:

Code:

??? Error using ==> plot
Vectors must be the same lengths.

Error in ==> new at 38
plot(M3(:,2),M2(:,1),'Marker','*','DisplayName','3.Messung'); figure
 



Evtl. 'ne Idee woran's hängen könnte?

Vielen Dank
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 20.08.2010, 22:15     Titel: Re: Mittelwert für gleiche 2. Spalte
  Antworten mit Zitat      
Hallo SVN88,

svn88 hat Folgendes geschrieben:

-69 0
-72 0
-88 0
-70 0
-63 0
-58 10
-56 10
-59 20
-58 20
-59 20
und würde gern jeweils den Mittelwert für die gleichen Werte der 2. Spalte (0, 10, 20 ) bilden.


Hast Du es mal mit ACCUMARRAY versucht?
HISTC zählt dazu noch die Anzahl der Bins.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
svn88
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 14.07.10
Wohnort: ---
Version: 7.6.0 (R2008a)
     Beitrag Verfasst am: 21.08.2010, 01:01     Titel:
  Antworten mit Zitat      
Hi Jan,

Zitat:
Hast Du es mal mit ACCUMARRAY versucht?
HISTC zählt dazu noch die Anzahl der Bins.


nein bisher noch. Die Version von Maddy hat mich soweit überzeugt. Aber danke für den Hinweis, werde ich mir bei Gelegenheit auch mal anschauen.

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
svn88
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 14.07.10
Wohnort: ---
Version: 7.6.0 (R2008a)
     Beitrag Verfasst am: 21.08.2010, 01:05     Titel:
  Antworten mit Zitat      
svn88 hat Folgendes geschrieben:
Hi Maddy,

vielen Dank für den Lösungsvorschlag. Leider funktioniert es nicht wenn ich mehrere plots von Vektoren in eine figure machen will, zum Beispiel bei:

Code:

plot(M1(1:16,2),M1(1:16,1),'Marker','diamond','DisplayName','1.Messung'); figure(1)
plot(M2(1:24,2),M2(1:24,1),'Marker','x','DisplayName','2.Messung'); figure(1)
plot(M3(1:22,2),M2(1:22,1),'Marker','*','DisplayName','3.Messung'); figure(1)
plot(M4(1:15,2),M2(1:15,1),'Marker','o','DisplayName','4.Messung'); figure(1)
plot(M5(1:24,2),M5(1:24,1),'Marker','+','DisplayName','5.Messung'); figure(1)
 


....



ups, Fehler in der Matrix, wenn man den Code richtig schreibt, funktioniert es auch Very Happy

Code:

plot(M3(1:22,2),M3(1:22,1),'Marker','*','DisplayName','3.Messung'); figure(1)
plot(M4(1:15,2),M4(1:15,1),'Marker','o','DisplayName','4.Messung'); figure(1)
plot(M5(1:24,2),M5(1:24,1),'Marker','+','DisplayName','5.Messung'); figure(1)
 


und dann dementsprechend für alle Vektoren:

Code:

plot(M3(:,2),M3(:,1),'Marker','*','DisplayName','1.Messung'); figure
 

usw.

nochmals Danke
Private Nachricht senden Benutzer-Profile anzeigen
 
Maddy
Ehrenmitglied

Ehrenmitglied



Beiträge: 494
Anmeldedatum: 02.10.08
Wohnort: Greifswald
Version: ---
     Beitrag Verfasst am: 23.08.2010, 08:39     Titel:
  Antworten mit Zitat      
Zusatzanmerkung:
DU hast da sehr merkwürdigen Plot-Code.

Wieso schreibst du hinter jede Zeile figure(1)?

Ein einfaches

Code:

figure(1)
plot(M1....)
hold on
plot(M2....)
plot(M3....)
%etc.
hold off


sollte ausreichen. Smile
_________________

>> why
The computer did it.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.