Verfasst am: 21.04.2011, 16:57
Titel: Spaltenvektor zerstückeln & je nach Wert in versch. Spa
Hallo zusammen,
leider bin ich im Forum bzgl. meinem Problem nicht fündig geworden - daher bräuchte ich bitte wieder eure Hilfe!
Es geht darum, dass ich aus einem Bild mit verschiedenen Objekten die jeweiligen Schwerpunkte errechnet habe.
Diese Schwerpunkte wurden in einen Spaltenvektor centroids_v abgespeichert.
Um Objekte mit ähnlichem Pixelschwerpunkt von anderen Objekte (entspricht größer bzw. kleineren Pixelschwerpunkt) zu ermitteln, habe ich den Spaltenvektor centroids_v zusätzlich noch differenziert.
In einer while-Schleife wollte ich nun die jeweils ähnlichen Pixelpunkte in je einer eigenen Spalte zusammen fassen - nur leider funktioniert dies nicht...
Der 1. Durchlauf funktioniert. Da werden Zeilen 1:3 ausgelesen und in die Matrix temp_cen_v (1. Spalte) abgespeichert.
Beim 2. Durchlauf erfolgt jedoch der Code "Subscripted assignment dimension mismatch" , da bspw. der Bereich 4:7 in die Matrix temp_cen_v (2. Spalte) abgespeichert werden sollte. Das wären zum 1. Durchlauf 4 Werte...
Wie kann man den Code am Besten umschreiben, damit Fehler eliminiert werden können?
Wenn möglich, sollten zusätzliche FOR-Schleifen vermieden werden.
i = 0;
j = 0;
old_val = 1;
end_val = 0;
%temp_cen_v = zeros(4, 6);
while j < length( cent_diff_vma )
j = j + 1; % Wert aus Zeile von max. Schwerpunkt-Ableitung
i = i + 1; % Abspeicherung in Spalte i
% Ermitteln der letzten Zeile, um nur Werte mit ähnlichem Pixelabstand auszulesen
end_val = cent_diff_vma ( j, 1);
r = 4 - mod(end_val,4);
if j < length( cent_diff_vma ) % old_val und end_val entsprechen immer den Bereich, in dem der Pixelabstand ähnlich ist
temp_cen_v ( :, i ) = ( centroids_v ( old_val : end_val, 1));
continue;
else
% Wenn alle Bereiche ermittelt worden sind, dann abspeichern und für jede % Spalte den Durchschnitt (alle Werte ohne 0) ermitteln
temp_cen_v ( :, i ) = centroids_v ((end_val+1) : end, 1);
temp_cen_v ( end+1, : ) = round(sum( temp_cen_v) ./ sum( temp_cen_v ~= 0));
prinzipiell ist deine Idee nicht schlecht, allerdings habe ich wieder - wie schon bei anderen versuchen - wieder das Problem, dass alle Werte in einem Spaltenvektor stehen.
Das hieße, ich müsste dann erst mit einer FOR-Schleife alle rows einzeln auslesen, und ähnliche Werte dann zusammenfassen.
Wenn es noch andere Möglichkeiten gibt, wäre ich euch sehr dankbar!
wenn ich das richtig verstanden habe, ist das Problem, dass du eine Matrix erstellen willst deren erste Spalte (hier!) 3 Elemente hat, die zweite 4 Elemente, etc.. Dummerweise geht das in Matlab jedoch nicht, du musst eine konstante Anzahl an Spaltelementen bzw. Zeilenelementen haben. D.h. in diesem Beispiel müsste das vierte Element in der ersten Spalte auch noch "gefüllt" werden, z.B. mit einer Null initialisieren.
In deinem Code ist das eh schon vorgesehen mit der auskommentierten Zeile
Du kannst entweder den kompletten Spaltenvektor durchgehen und schauen was die größte Anzahl an Elementen in einer Spalte wäre, oder du gehst einfach davon aus, dass im Worst-Case die Umsortierung des ursprünglichen Spaltenvektors wieder einen Spaltenvektor ergibt. Dann könntest du einfach "temp_cen_v" wie folgt initialisieren:
Natürlich musst du in deiner Schleife dann auch die Länge der Vektoren die du beschreiben willst anpassen. Bei einer Zuweisung muss die Länge des Vektors links und rechts des Gleichheitszeichens gleich sein, wenn dieser bereits existiert. Bei mir läuft folgender Code, vllt kannst du damit ja weiterarbeiten:
i = 0;
j = 0;
old_val = 1;
end_val = 0;
temp_cen_v = zeros(length(centroids_v ));
Spaltennummer = 0;
while j < length( cent_diff_vma )
j = j + 1; % Wert aus Zeile von max. Schwerpunkt-Ableitung
i = i + 1; % Abspeicherung in Spalte i
% Ermitteln der letzten Zeile, um nur Werte mit ähnlichem Pixelabstand auszulesen
end_val = cent_diff_vma ( j, 1);
r = 4 - mod(end_val,4);
if j < length( cent_diff_vma ) % old_val und end_val entsprechen immer den Bereich, in dem der Pixelabstand ähnlich ist
temp_cen_v (1:length(centroids_v ( old_val : end_val, 1)), i ) = ( centroids_v ( old_val : end_val, 1));
continue;
else
% Wenn alle Bereiche ermittelt worden sind, dann abspeichern und für jede % Spalte den Durchschnitt (alle Werte ohne 0) ermitteln
temp_cen_v (1:length(centroids_v ((end_val+1) : end, 1)), i ) = centroids_v ((end_val+1) : end, 1);
temp_cen_v (end, : ) = round(sum( temp_cen_v) ./ sum( temp_cen_v ~= 0));
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.