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

Spaltenvektor zerstückeln & je nach Wert in versch. Spa

 

hotelbravo
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 14.03.11
Wohnort: ---
Version: R2010b
     Beitrag Verfasst am: 21.04.2011, 16:57     Titel: Spaltenvektor zerstückeln & je nach Wert in versch. Spa
  Antworten mit Zitat      
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...

Matlab-Fehler: Subscripted assignment dimension mismatch

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.


Code:

centroids_v = [100,891538583426
104,158471644576
112,187027861262
287,362442771198
289,360375562478
291,645222172076
293,860280584073
473,564928246412
474,151133401785
474,844670218478
475,448197535019
657,262446855009
656,406863560732
660,992172376063
];

cent_diff_vma = [3; 7; 11; 14];


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 ) );
       
        break;
    end
   
    old_val = end_val + 1; % Abspeichern für neuen, unteren Werte-Bereich

end
 



Falls etwas unklar sein sollte, bitte Nachfragen !!!


Ansonsten schon mal vielen Dank für Eure Mithilfe !
Private Nachricht senden Benutzer-Profile anzeigen


MatLabNooB
Forum-Guru

Forum-Guru


Beiträge: 262
Anmeldedatum: 27.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.04.2011, 21:25     Titel:
  Antworten mit Zitat      
ich würde erstmal einen vektor "binEdges" definieren, und dann mittels histc die binindizes von "centroids_v" abgreifen
Code:
[unused binIdx] = histc(centroids_v,binEdges)

und anschliessend die einteillung mittel accumarray
Code:
temp_cen_v = accumarray(binIdx,centroids_v,[],@(x) {x})
 


gruß Matlabnoob
Private Nachricht senden Benutzer-Profile anzeigen
 
hotelbravo
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 14.03.11
Wohnort: ---
Version: R2010b
     Beitrag Verfasst am: 26.04.2011, 10:25     Titel:
  Antworten mit Zitat      
Hallo,

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!
Private Nachricht senden Benutzer-Profile anzeigen
 
EliteTUM
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 70
Anmeldedatum: 21.04.11
Wohnort: München
Version: ---
     Beitrag Verfasst am: 26.04.2011, 11:32     Titel:
  Antworten mit Zitat      
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

Code:

%temp_cen_v = zeros ( 4, 6 );
 


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:

Code:

temp_cen_v = zeros ( length(centroids_v ) );
 


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:

Code:

centroids_v = [100,891538583426
104,158471644576
112,187027861262
287,362442771198
289,360375562478
291,645222172076
293,860280584073
473,564928246412
474,151133401785
474,844670218478
475,448197535019
657,262446855009
656,406863560732
660,992172376063
];

cent_diff_vma = [3; 7; 11; 14];


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 ) );
       
        break;
    end
   
    old_val = end_val + 1; % Abspeichern für neuen, unteren Werte-Bereich

end
 

_________________

- EliteTUM
_____________________________________
Private Nachricht senden Benutzer-Profile anzeigen
 
hotelbravo
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 14.03.11
Wohnort: ---
Version: R2010b
     Beitrag Verfasst am: 26.04.2011, 12:21     Titel:
  Antworten mit Zitat      
Super, Danke !!!!

Das hat mir sehr weitergeholfen!
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.