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

Nullen in einem Vektor zählen

 

Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.10.2008, 10:00     Titel: Nullen in einem Vektor zählen
  Antworten mit Zitat      
Hallo zusammen,

ich habe ein sehr einfaches Problem, aber finde keinen richtigen Befehl mit dem das in wenigen Zeilen geht.

Wie kann man die Nullen in einem Vektor zählen?

Wäre euch sehr dankbar.

Grüße....


steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.029
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2024a
     Beitrag Verfasst am: 07.10.2008, 10:08     Titel:
  Antworten mit Zitat      
Moin,

Code:
v = zeros(1,5);
v(1) = 123;
nullen = length(find(~v));


Gruß
Alex
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
student
Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 10.03.08
Wohnort: ---
Version: 7.0
     Beitrag Verfasst am: 08.10.2008, 13:09     Titel:
  Antworten mit Zitat      
geht auch "klassisch"

Code:

einsen=ones(size(vektor));
anzahl_nullen=sum(einsen)-sum(einsen&vektor);
 


Grüsse
Student
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 08.10.2008, 13:24     Titel:
  Antworten mit Zitat      
oder auch so:

Code:

A=[0 2 3 0 5 6 7 0];
anzNullen= sum(A==0);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Dionysos
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 64
Anmeldedatum: 16.09.09
Wohnort: ---
Version: R2011a
     Beitrag Verfasst am: 24.11.2010, 22:56     Titel:
  Antworten mit Zitat      
Hallo zusammen,

ich versuche derzeit Werte zu zählen aber bekomme es einfach nicht auf die Reihe. Mein Ansatz sind mehrere verschachtelte For-Schleifen, aber irgendwie is das umständlich und ich komme nicht ans Ziel.
Verschiedene Werte stehen in einem Vektor.
Code:

a=[0 0 1 2 3 0 4 5 0 0 0 0 7 8 9 0 4 3 0 2]
 


Das Ziel soll sein, jeweils die Werte zwischen den Nullen zu berechnen und in einem neuen Vektor abzuspeichern.

Code:

b=[6 9 24 7 2 ]
 


Das wars schon Sad Ich hoffe ihr könnt mir weiterhelfen.
Schonmal vielen Dank!
_________________

Dionysos
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 25.11.2010, 01:05     Titel:
  Antworten mit Zitat      
Hallo

schau einmal hier
http://www.gomatlab.de/subsets-eine.....sind-summieren-t8552.html

oder von hier kannst auch
http://www.gomatlab.de/bestimmt-ber.....rix-summieren-t12831.html
solche Lösung basteln
Code:

a=[0 0 1 2 3 0 4 5 0 0 0 0 7 8 9 0 4 3 0 2];
pos = vertcat(strfind([0,a>0, 0],[0 1]),strfind([0, a>0, 0],[1 0])-1);
str = sprintf('sum(a(%d:%d)),',pos);
str = sprintf('[%s];',str(1:end-1));
b=eval(str)
 
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: 26.11.2010, 03:50     Titel:
  Antworten mit Zitat      
Hallo Dionysos,
Code:

a = [0 0 1 2 3 0 4 5 0 0 0 0 7 8 9 0 4 3 0 2];
if a(end) == 0
  aNotZero = (a ~= 0);
else
  aNotZero = [(a ~= 0), true];
end
index = findstr(aNotZero, logical([1, 0]));
b = cumsum(a);
c = [0, aAccum(index)];
result = diff(c);
 

Nun, hübsch ist das so nicht. Es geht auch verschwenderisch mit dem Speicher um. Eine FOR-Schleife sähe zumindest optisch besser aus:
Code:

a = [0 0 1 2 3 0 4 5 0 0 0 0 7 8 9 0 4 3 0 2];
n = nnz(a);  % Anzahl der nich-Null-Elemente
b = zeros(1, n);  % Pre-allocate
j = 0;
s = 0;
start = find(a, 1, 'first');
for i = start:length(a)
  if a(i) == 0
     j = j + 1;
     b(j) = s;
  else
     s = s + a(i);
  end
end

if s ~= 0   % Flush last element
   j = j + 1;
   b(j) = s;
end
 

Das ist wharscheinlich gar nicht mal so langsam. Aber die Aufgabe schreit danach in C programmiert zu werden.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.11.2010, 11:01     Titel:
  Antworten mit Zitat      
Hallo Jan,

rein aus Interesse:
Aber die Aufgabe schreit danach in C programmiert zu werden.
Warum?
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 28.11.2010, 21:25     Titel:
  Antworten mit Zitat      
Hallo Anonymous,

Matlab kann sehr effizient mit Vektoren und Matrizen rechnen. Ein äußeres Produkt ist z.B. nahezu trivial:
Code:
x = rand(5, 1);
y = rand(1, 5);
M = x * y;  % => [5 x 5] matrix
 

In C wäre das erschrecken häßlich!
In Deinem Problem bezieht sich aber auf einzelne Elemente eines Vektors. Die FOR-Schleifen laufen in Matlab 2009 zwar dank JIT schon viel besser als in Matlab 5.3, aber ein Geschwindigkeitsrausch kommt dabei nicht gerade auf.
Beispiel: Finde die erste Zahl x in einem Vektor y:
Code:
% Matlab:
find(y == x, 1, 'first');

Wenn y nun riesig ist, muss zuerst ein riesiger LOGICAL Vektor erstellt werden (y == x), der dann kurze Zeit später wieder verworfen wird.
In C kann man dagegen auf den temporären Vektor verzichten:
Code:
for (i = 0; i < n; i++) {
  if (y[i] == x) {
    break;
  }
}

Wenn nun z.B. das erste Element gleich ein Treffer ist, muss der Rest des Vektors nicht durchsucht werden - in Matlab leider nicht möglich.

Wenn also die Elemente eines Vektors seriel abgearbeitet werden müssen, ist ein C (oder Fortran)-Mex viel besser geeignet. Für das Hantieren mit ganzen Vektoren oder mehrdimensionalen Arrays ist C dagegen grausam: Man kann zwar ähnlich gute Laufzeiten wie in Matlab erreichen, aber die Programmierzeit ist 10 bis 50 mal so hoch, und bei Problemen ist die Debug-Zeit 100 mal höher!

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Dionysos
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 64
Anmeldedatum: 16.09.09
Wohnort: ---
Version: R2011a
     Beitrag Verfasst am: 30.11.2010, 16:09     Titel:
  Antworten mit Zitat      
@ denny: Wunderbar! Wenn man mal dahinter kommt was da passiert, genau das was ich gesucht habe, danke.
Das Zauberwort war"summieren", ich habe nach allem anderen gesucht nur nicht danach.

Die anderen Ideen sind auch gut, aber dann doch recht kompliziert zum Einlesen für einen Außenstehenden.

Danke euch allen
_________________

Dionysos
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.