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.
a = [00123045000078904302];
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 = [00123045000078904302];
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
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:
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:
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!
@ 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
Einstellungen und Berechtigungen
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
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.