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

Elemente in Vektor ohne for-loop zählen

 

Tobias14
Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 15.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.12.2014, 14:39     Titel: Elemente in Vektor ohne for-loop zählen
  Antworten mit Zitat      
Hallo zusammen,

ich würde gerne in einem Vektor (ganze positive Zahlen) jeweils auszählen, wie oft bestimmte Zahlen dort vorkommen.

z.B.

Code:

n=20;
M=randi(n,1000,1); % Zufälliger Vektor der ganze Zahlen bis Max 20 enthält

for i=1:n
A(i)=sum(M==i);
end
 


somit kann ich beispielsweise zählen wir oft die Zahl 1 in dem Vektor M vorkommt. Ich möchte allerdings alle Zahlen von 1 bis 20 in dem Vektor M zählen... wie es mit der for-schleife auch funktioniert. Allerdings bekomm ich es nicht ohne for-schleife hin. Bei meinen Realdaten läuft i allerdings bis zu mehrerer Millionen weswegen das ganze dann ewig dauert.
Kann mir jemand helfen?

Viele Grüße
Tobias
Private Nachricht senden Benutzer-Profile anzeigen


Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 16.12.2014, 15:21     Titel:
  Antworten mit Zitat      
Ich dachte spontan an den HISTCOUNTS Befehl, war aber zunächst wegen der Performance enttäuscht. Je grösser n aber wird, desto besser schneidet er ab:

Code:


n=20000;
M=randi(n,1000,1); % Zufälliger Vektor der ganze Zahlen bis Max n enthält

tic
for i=1:n
A(i)=sum(M==i);
end
t1=toc

tic
A=histcounts(M);
t2=toc

t2/t1
 


Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Ingwertee

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.12.2014, 15:46     Titel:
  Antworten mit Zitat      
1. Variante (spontaner Einfall)

Code:

tic
n=10^5;
m=10^5;
M=randi(n,m,1); % Zufälliger Vektor der ganze Zahlen bis Max 20 enthält

for ii =1:n
s = size(find(M==ii));
%fprintf('Die Zahl %i kommt %i mal vor.\n',ii,s(1))
end
toc
 


nachteil, ist dass find nicht unbedingt effektiv ist. Habe es mal mit einem recht großen n getestet und meine 1. Variante (ca. 27 sec) ist etwa gleich langsam wie mit deinem Vorgehen (ca. 28 sec).

2. Variante (kurzes Grübeln)

Code:

tic
n=10^6;
m=10^6;
M=randi(n,m,1); % Zufälliger Vektor der ganze Zahlen bis Max 20 enthält

C = zeros(1,n);

for ii =1:m
C(M(ii)) = C(M(ii)) + 1;
end
%fprintf('Die Zahl %i kommt %i mal vor.\n',[[1:n];C])
toc
 


Vorteil der 2. Variante ist, dass der Vektor nur einmal durchgegangen werden muss, um all Zahlen zu finden. Bei mir dauert es selbst für einen recht großen Vektor weniger als 0,07sec.
Da bleibt keine Zeit mehr für Teetrinken Wink

Ne Variante ohne Schleife fällt mir jedoch nicht ein.
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 16.12.2014, 16:28     Titel:
  Antworten mit Zitat      
Hallo

so noch eine weitere Möglichkeit
Code:

tic

n    = 20;
m    = 10^6;
M    = randi(n,m,1); % Zufälliger Vektor der ganze Zahlen bis Max 20 enthält
bins = 1:n;
C    = histc(M, bins);

toc

 
Private Nachricht senden Benutzer-Profile anzeigen
 
Tobias14
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 15.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.12.2014, 16:37     Titel:
  Antworten mit Zitat      
Danke euch beiden für die Hilfe!
Ich habe es nun mit histc gelöst. Hier der Vergleich

Code:

n=10^8;
m=10^8;
M=randi(n,m,1);

% Methode 1
tic
C=zeros(1,n);
for ii=1:m
C(M(ii))=C(M(ii))+1;
end
t1=toc

% Methode 2
tic
bins=1:n;
C=histc(M,bins);
t2=toc

 


Methode 2 ist bei mir (vor allem für sehr große Werte) deutlich schneller. Im Beispiel hier komme ich auf einen Faktor von 27.
Ich denke damit ist mein Problem nun gelöst.
Vielen Dank!
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 16.12.2014, 17:48     Titel:
  Antworten mit Zitat      
HISTC ist letztendlich die alte Umsetzung von HISTCOUNTS Very Happy

In der R2014b Dokumentation steht: "histc is not recommended. Use histcounts instead." Ich nehme an das heisst verklausuliert, dass HISTC irgenwann einmal nicht mehr existiert.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Tobias14
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 15.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.12.2014, 18:24     Titel:
  Antworten mit Zitat      
Wenn man noch mit 2012 arbeitet gibt es leider keine andere Möglichkeit.
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.