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

Sortieren,etc

 

razer
Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 06.03.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.03.2008, 08:56     Titel: Sortieren,etc
  Antworten mit Zitat      
Hallo Leute!

Folgendes:Nehmen wir an,ich hab nen Spaltenvektor mit verschiedenen Werten drin und es ist so,dass manche davon mehrmals vorkommen.

Meine Frage:Ich will jetzt wissen,welcher Wert kommt am öftesten vor, wie stelle ich das an?Hab zuerst gedacht mit Häufung etc,aber wie mache ich das in Matlab?Weiteres kleines Problem ist,dass die Werte im Vektor kleine Fehler aufweisen,soll heißen,dass zB 1 und 1.001 der gleiche Wert sein sollen...


Grüße
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 06.03.2008, 09:56     Titel:
  Antworten mit Zitat      
Hallo, versuch mal folgendes

Code:

% konvertieren zuerst in integer
A = int32(rand(100,1)*100);
%
% Zahlen im array
El_inA=unique(A);
%
% Array um die Häufigkeit zu speichern
Haeuf=zeros(1,length(El_inA));
%
% bertrachte mir alle Zahlen vorkommen und berechne die Häufigkeit
for i =1:length(El_inA)
Haeuf(i)=sum(A==El_inA(i))
end

% Ausgabe einer Zahl, die am häufigsten vorkommt
[maxEl,posEl]=max(Haeuf);
fprintf('Zahl %d ist %d Mal vorgekommen\n',El_inA(posEl),maxEl);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
razer
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 06.03.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.03.2008, 10:08     Titel:
  Antworten mit Zitat      
Okay,danke erstmal!
Ich habs anders gemacht,etwas umständlicher,ohne for schleife.
Jetzt tritt noch ein Problem auf:Sagen wir,ein Wert tritt 20 mal auf und ein anderer 19 mal.Einer der beiden ist größer und den will ich.Was mache ich,wenn der,den ich will,also der größere der beiden, nur am zweitöftesten auftritt?

Gruß

edit:Ich bräuchte also den Index des Wertes,der am öftesten auftritt und gleichzeitig am größten ist,so ne Art Schnittmenge.
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 06.03.2008, 11:05     Titel:
  Antworten mit Zitat      
Weiß nicht, welcher Weg hier hilfreich wäre.
(denn von der Logik her schließen sich diese 2 Mengen doch aus)

Ich wurde vielleicht erstmal die maximale Zahlen nach Häufigkeit absteigend sortieren.
Code:

El_inHauef = unique(Haeuf);

maxZahl = zeros(1,length(El_inHauef));
for i=length(El_inHauef):-1:1;
   maxZahl(i)=max(El_inA(Haeuf==El_inHauef(i)));
end

 


und dann suchst du dir selbst raus, welche Zahl dir am Besten passt
Private Nachricht senden Benutzer-Profile anzeigen
 
razer
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 06.03.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.03.2008, 13:30     Titel:
  Antworten mit Zitat      
Ziemlich cool,danke Smile
Ein Problem hab ich noch:Ich habe Daten,die irgendwie verrauscht sein können.Deswegen rundest du mit integer32 oder?Was ist der Unterschied zwischen den integer's,warum nimmst du das 32er?

Gruß

Edit:Ich möchte im Prinzip zum Errechnen der Häufigkeiten die Schwankunegn unterdrücken,aber möchte,nachdem ich weiß,welcher am öftesten vorkommt, den größten ungerundeten Wert haben.

Hm voll blöd ausgedrückt.

Nehmen wir an,ich hab einen Vektor mit 1.01 0.98 0.99 1.02 1.03 3.00 3.02 3.02 3.01 3.03 3.00 2.99 2.98 .... usw,dann rundest du und siehst,dass 3 am öftesten vorkommt.Und dann will ich den größten Wert,der aus dem ursprünglichen Vektor zu diesem Ergebniss geführt hat,also in diesem Fall ehm 3.03 Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 06.03.2008, 13:56     Titel:
  Antworten mit Zitat      
Ach so, jetzt verstehe was du meinst dann könnte man so machen
Code:

% konvertieren zuerst in integer
ungerundA = rand(100,1)*100;
gerundetA = fix(ungerundA);
%
% Zahlen im array
El_inA=unique(gerundetA);
%
% Array um die Häufigkeit zu speichern
Haeuf=zeros(1,length(El_inA));
%
% bertrachte mir alle Zahlen vorkommen und berechne die Häufigkeit
for i =1:length(El_inA)
 Haeuf(i)=sum(gerundetA==El_inA(i));
end

El_inHauef = unique(Haeuf);

maxZahl = zeros(1,length(El_inHauef));
for i=length(El_inHauef):-1:1;
 maxZahl(i)=max(El_inA(Haeuf==El_inHauef(i)));
end

[maxUngerundetVal,posUZahl]=max(ungerundA(gerundetA==maxZahl(1)));
 



Zitat:

Ein Problem hab ich noch:Ich habe Daten,die irgendwie verrauscht sein können.Deswegen rundest du mit integer32 oder?Was ist der Unterschied zwischen den integer's,warum nimmst du das 32er?


mit int32 habe ich einfach die Kommastellen abgeschnitten, da ich deinen Zahlenbereich nicht wußte, habe ich integer 32 Bit genommen
Zahlenbereich zwischen( -2^31 bis 2^31-1)

aber man kann auch einfach die Funktion fix verwenden
Private Nachricht senden Benutzer-Profile anzeigen
 
razer
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 06.03.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.03.2008, 14:13     Titel:
  Antworten mit Zitat      
razer hat Folgendes geschrieben:
Hm voll blöd ausgedrückt.

Nehmen wir an,ich hab einen Vektor mit 1.01 0.98 0.99 1.02 1.03 3.00 3.02 3.02 3.01 3.03 3.00 2.99 2.98 .... usw,dann rundest du und siehst,dass 3 am öftesten vorkommt.Und dann will ich den größten Wert,der aus dem ursprünglichen Vektor zu diesem Ergebniss geführt hat,also in diesem Fall ehm 3.03 Smile


Geht dein Weg auch,wenn ich Werte weit über 3 (mein Beispiel) drin habe,die aber eben kA nur zweimal vorkommen oder so,wie zB irgendwelche Ausreißer oder so?Der Wert,der bei dir vorkommt,ist somit von den häufigsten der größte,oder?
Fix rundet einfach immer ab oder?

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 06.03.2008, 14:37     Titel:
  Antworten mit Zitat      
Fix rundet immer in Richtung 0
das heißt 3.9=3 und -3.9=-3

kleiner Nachtrag( hab da noch kleinen Fehler):
Code:


% so kriege idex auf größten Zahl
posZahl=find(gerundetA==maxZahl(1));
[maxUngerundetVal,tmpPos]=max(ungerundA(posZahl))

posUZahl=posZahl(tmpPos)
 


wurde für 2 Zahlen mit Wert 3.303 nicht funktionieren
Doubles kann man leider nicht miteinander vergleichen,
also ist 3.303 nicht gleich 3.303
vielleicht entschließt du dich bist zu 3 Stelle zu vergleichen
also fix(Zahl*1000), dann könnte man solche Ähnlichkeiten finden

Code:


% so kriege idex auf größten Zahl
posZahl=find(gerundetA==maxZahl(1));
[maxUngerundetVal]=max(ungerundA(posZahl))

%indizien von maximalen Zahlen
tmpPos=fix(ungerundA(posZahl)*1000)==fix(maxUngerundetVal*1000)
posUZahl=posZahl(tmpPos)

 
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 06.03.2008, 14:44     Titel:
  Antworten mit Zitat      
Hallo,

ich misch mich mal mit einem ganz neuen Vorschlag ein, der für die Häufigkeitsauszählung den Befehl hist verwendet:

Code:
ungerundA = rand(100,1)*100;
gerundetA = round(ungerundA);   % Achtung: fix rundet alles Richtung Null!

El_inA = unique(gerundetA);     % vorkommende Werte

[n,bins] = hist(gerundetA,El_inA);
maxHaeuf = max(n)               % maximale Häufigkeit eines Wertes
maxHaeufWert = bins(n==maxHaeuf)  % Dies kann ein Vektor sein -> for-Schleife

ind = [];
for k = 1:length(maxHaeufWert)
ind = [ind;find(gerundetA==maxHaeufWert(k))]; % Hier befinden sich die Werte
end
maxWert = max(ungerundA(ind))   % größter ungerundeter Wert
maxWertIndex = find(ungerundA==maxWert) % Hier befindet sich der maxWert in ungerundA


Was soll eigentlich herauskommen, wenn es im gerundeten Vektor mehrere Werte gibt, die "am häufigsten" vorkommen? Bei dem Zufallsvektor von denny, den ich auch genommen hab, kommt das regelmäßig vor. Dann ist maxHaeufWert ein Vektor. In meinem Code wird auch von diesen der größte ausgewählt.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 06.03.2008, 14:56     Titel:
  Antworten mit Zitat      
Danke, Bijick!
Cool, hab nicht gewusst, dass mit Funktion hist auch nur Häufigkeiten berechnen kann. Ich hab gedacht dass Sie nur für Zeichnen der Häufigkeitsverteilung da ist.
Private Nachricht senden Benutzer-Profile anzeigen
 
razer
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 06.03.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.03.2008, 14:58     Titel:
  Antworten mit Zitat      
Bijick hat Folgendes geschrieben:
Hallo,

ich misch mich mal mit einem ganz neuen Vorschlag ein, der für die Häufigkeitsauszählung den Befehl hist verwendet:

Code:
ungerundA = rand(100,1)*100;
gerundetA = round(ungerundA);   % Achtung: fix rundet alles Richtung Null!

El_inA = unique(gerundetA);     % vorkommende Werte

[n,bins] = hist(gerundetA,El_inA);
maxHaeuf = max(n)               % maximale Häufigkeit eines Wertes
maxHaeufWert = bins(n==maxHaeuf)  % Dies kann ein Vektor sein -> for-Schleife

ind = [];
for k = 1:length(maxHaeufWert)
ind = [ind;find(gerundetA==maxHaeufWert(k))]; % Hier befinden sich die Werte
end
maxWert = max(ungerundA(ind))   % größter ungerundeter Wert
maxWertIndex = find(ungerundA==maxWert) % Hier befindet sich der maxWert in ungerundA


Was soll eigentlich herauskommen, wenn es im gerundeten Vektor mehrere Werte gibt, die "am häufigsten" vorkommen? Bei dem Zufallsvektor von denny, den ich auch genommen hab, kommt das regelmäßig vor. Dann ist maxHaeufWert ein Vektor. In meinem Code wird auch von diesen der größte ausgewählt.

Herzliche Grüße
Bijick


Hallo!

Habs selbst mit histc versucht,kannte aber den Befehl Unique noch nicht, was mir das ganze erschwert hat.
Ja,wenn im Vektor mehrere Werte gleich oft vorkommen,dann soll das Programm das größten davon auswählen.
Wenn also zB 44 und 98 jweils 5 mal vorkommen,dann ist 98 der gesuchte Wert.


Grüße und vielen Dank,

r.

edit:Finde das Programm super,vielen Dank euch beiden!
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 - 2024 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.