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

Häufigkeit von Werten in einer Matrix ploten

 

Jekyll
Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 12.07.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.02.2011, 15:16     Titel: Häufigkeit von Werten in einer Matrix ploten
  Antworten mit Zitat      
Hallo alle zusammen,

mein Aufgabe ist folgende:
Ich möchte mir in einem Histogramm anzeigen lassen, wie oft welcher Wert in meiner Matrix vertreten ist.

Ich bin bis jetzt soweit:
Code:

Matrix = round(rand(123,512)*5000);

  for i=1:123
            [haeuf,unique_wert]=hist(Matrix(i,:), unique(Matrix(i,:)));
  end

figure
bar(unique_wert, haeuf)
 


Das Problem ist jetzt aber:
Mein Plot zeigt natürlich nur die Werte aus meinem letzten durchlauf der Schleife (der letzten Spalte meiner Matrix). Allerdings brauche ich ja aber einen Plot mit der Summe aller Durchläufe (Summe aller Spalten mit Wert).

Jemand eine Idee???
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: 02.02.2011, 16:17     Titel: Re: Häufigkeit von Werten in einer Matrix ploten
  Antworten mit Zitat      
Hallo Jekyll,

Wenn Du die "Summe aller Durchläufe" brauchst, ist eine eine naheliegende Strategie, die Summe aller Durchläufe zu berechnen. Im Ernst. Oft liegt in der deutschen Formulieren bereits die Lösung.
Da nun insgesamt 5001 Werte möglich sind, kannst Du HIST ja gleich über diese Werte einteilen lassen:

Code:

H = zeros(1, 5001);
Matrix = round(rand(123, 512) * 5000) + 1;
for i = 1:123
   H = H + hist(Matrix(i,:), 1:5001));
end

unique_wert = find(H ~= 0) - 1;
figure
bar(unique_wert, H)
 

Vielleicht muss H als Spaltenvektor definiert werden, ich kann gerade Matlab nicht für einen Test laufen lassen.
Eine Schwierigkeit sind noch die 0-basierten Werte von ROUND(RAND). Deshalb habe ich mal eine 1 addiert, später wieder abgezogen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 02.02.2011, 16:28     Titel:
  Antworten mit Zitat      
Hallo,

also vielleicht habe ich dein Problem auch falsch verstanden, aber wenn du nur die Haeufigkeit deine Werte in der Matrix anzeigen lassen moechtest wuerde dies auch viel einfacher und auch ohne Schleife funktionieren:

Code:

test = [1 5 5 20 25 30 1 50 50 50 1 1 100 100];
n = histc(test,unique(test));
bar(unique(test),n);
% bzw. fuer Matrizen
test = round(rand(5,5).*10);
n = histc(test,unique(test));
bar(unique(test),sum(n,2));
 


Wenn du dies mit der Summe meintest wird wohl Jan seine Loesung funktionieren, auch wenn ich sie mir jetzt nicht bis ins letzte Detail angeschaut habe.

MFG

Sco
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: 02.02.2011, 16:49     Titel:
  Antworten mit Zitat      
Hallo Sco,

Ich glaube, Dein Ansatz ist eher was Jekyll sucht. Zudem ist HISTC hier irgendwie logischer als HIST.

Eine weiter Idee wäre:
Code:
M = round(rand(100) * 5000);
H = accumarray(M(:) + 1, 1);
plot(0:5000, H);

Ich finde allerdings die Syntax von ACCUMARRAY ausgesprochen unhandlich.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 02.02.2011, 21:47     Titel:
  Antworten mit Zitat      
Hallo Jan,

bei dem Plot Befehl stimmen die Dimensionen der Vektoren nicht (immer).

Die Anzahl der x-Werte ist doch abhaenig von den Werten in M, welche wiederrum die Indizes fuer accumarray angeben. Deshalb laesst sich doch auch kein fester Wert fuer die x-werte festlegen (ausser ich weiss davor den Maximalwert in M), oder? Natuerlich ist bei 100*100 Werten die Wahrscheinlichkeit gross, dass mindesten 1 mal die 1 bzw. 5000 erzeugt wird, bei mir war es aber (wie es der Zufall eben so will) beim ausprobieren deines Codes nicht der Fall, so dass der Dimensionsfehler auftrat. Diese kleine Aenderung sollte das Problem beheben:
Code:

bar(0:length(H)-1,H);
% bzw.
plot(0:length(H)-1,H,'*','Linestyle','none');
 


Wenn ich mich irre, so lass es mich bitte wissen Smile

MFG

Sco

Zuletzt bearbeitet von Sco am 02.02.2011, 21:58, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

ich hätte auch noch einen Wink Das ganze direkt auf alle Elemente der Matrix (als Vektor aufgefasst) anwenden:
Code:
Matrix = round(rand(123,512)*5000);
[haeuf,unique_wert]=hist(Matrix(:), unique(Matrix(:)));
figure
bar(unique_wert, haeuf)


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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: 03.02.2011, 13:43     Titel:
  Antworten mit Zitat      
Hallo Sco,

Du hast ganz genau recht.
Code:
M = round(rand(100) * 5000);
H = accumarray(M(:) + 1, 1);
bar(0:length(H)-1,H);

Ich hatte so lange versucht in ACCUMARRAY die Liste von Bins als Input zu definieren, dass ich mich verhaspelt habe.
Wie könnte ACCUMARRAY das intern machen? Entweder es sucht zunächst die Daten durch, um das Maximum zu bestimmen, und danch ein zweites Mal um die Daten zu schreiben. Oder aber ACCUMARRAY benutzt keine pre-allocation und vergrößert die List ständig bei Bedarf. Das sollte sich leicht unterscheiden lassen: Eine rückwärts sortierter Input sollte ohne pre-allocation schneller sein als ein vorwärts-sortierter.
Moment bitte... Aha:
Code:
x = transpose(1:500000);
tic; for i = 1:10; m = accumarray(x, 1); end, toc
% 0.40 sec
x = flipup(x);
tic; for i = 1:10; m = accumarray(x, 1); end, toc
% 0.40 sec
x = x(randperm(length(x)));
tic; for i = 1:10; m = accumarray(x, 1); end, toc
% 0.87 sec

Sortierte Inputs werden also unabhängig von der Sortiertrichtung gleich schnell akkumuliert. Unsortierte Daten brauchen dagegen länger - wahrscheinlich erkennt ACCUMARRAY den sortierten Input und nutzt ein Binary-Search.
Aber: Wenn man stattdessen eine kleineren [50.000 x 1] Vektor verwendet, sind sortierte und unsortierte Daten gleich schnell. Also kommt es wohl auch darauf an, ob die Daten in den Prozessorcache passen.

Meine Schlußfolgerung: ACCUMARRAY ist für die Aufgabe nicht wirklich geeignet. HISTC ist aber auch noch ein Overkill, da es individuelle Bins erlaubt. Die Aufgabe, die Häufigkeit von Integern zu bestimmen, erschien hier öfter mal. Vielleicht wäre eine genau auf das Problem zugeschnittete MEX-Funktion eine gute Idee.

Gruß, Jan
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.