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

Strcture Felder vertauschen?

 

Derak
Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 23.10.08
Wohnort: BZ
Version: R14
     Beitrag Verfasst am: 19.11.2008, 09:40     Titel: Strcture Felder vertauschen?
  Antworten mit Zitat      
Hallo liebe Matlabfreunde.

Ich habe mal wieder ein Problem mit einem Strct. Ich habe ein 5x1 Struct, welches schon sortiert wurde und wo bestimmte Werte rausgenommen wurden. Soweit so gut. Für eine Bildregistrierung muss ich aber die Werte im ersten Feld mit den Werten im zweiten Feld vertauschen.

so sieht mein Code aus:

Code:

reginp2 = regionprops(label_image_2,'Centroid','Area');
[sVal2 sInd2] = sort([reginp2.Area]);
reginp2 = reginp2(sInd2(end-6:end));
reginp2(5:end) = [];
 


ich hab folgendes versucht

Code:

reginp2(1) = reginp2(5);
reginp2(2) = reginp2(1);
reginp2(5) = reginp2(2);
reginp2(5) =[];
 


bekomme da aber schon beim ersten Befehl die Fehlermeldung:
??? Index exceeds matrix dimensions.

Was mache ich falsch? Möchte einfach nur Feld 2 auf Position 1 legen und umgekehrt. Confused

Danke schonmal für eure Hilfe

Gruß
Derak
Private Nachricht senden Benutzer-Profile anzeigen


Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 19.11.2008, 12:09     Titel:
  Antworten mit Zitat      
Hallo Derak,

verstehe ich das richtig? reginp2 ist nach diesem Befehl nur noch 4x1.

Code:
reginp2(5:end) = [];


Also verursacht der Zugriff auf reginp2(5) in der nächsten Zeile einen Fehler. Du meinst wahrscheinlich:

Code:
reginp2(5) = reginp2(1);
reginp2(1) = reginp2(2);
reginp2(2) = reginp2(5);
reginp2(5) =[];


Oder einfach:

Code:
reginp2(1:2)=reginp2(2:-1:1);


Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Derak
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 23.10.08
Wohnort: BZ
Version: R14
     Beitrag Verfasst am: 20.11.2008, 11:51     Titel:
  Antworten mit Zitat      
Hallo Bijick,

ja das hast du richtig verstanden. Es ist nachher ein 4x1 Struct.
Hab die Sachen ausprobiert und es geht wunderbar. Hatte da wohl einen kleinen Denkfehler b Rolling Eyes . Danke für den Hinweiß.

benutze jetzt aber doch lieber den code von dir

Code:

reginp2(1:2)=reginp2(2:-1:1);
 


da du dich damit auszukennen scheinst hätte ich noch eine kleine frage.
Mein Struct beinhaltet ja 4 Felder.In jedem Feld sind jeweils die Areas und Centroids aufgeführt. Mit diesem Befehl wandle ich ja die ganze Sache erstmal in einen Vektor um und sortiere die ganze Sachen und behalte bei das Struct bei.

Code:

[sVal2 sInd2] = sort([reginp2.Area]);
reginp2 = reginp2(sInd2(end-6:end));
 


ich möchte nun versuchen die Centroids nach Y-Werten z.B. zu ordnen. Problem an der Sache ist das Centroid jeweils 2 Werte enthält. DIe X-Werte und Y-Werte von den Punkten.

wenn ich das versuche
Code:

[dVal dInd] = sort([reginp2.Centroid]);
reginp2 = reginp2.Centroid(dInd);
 


kommt die fehlermeldung:
??? Field reference for multiple structure elements that is followed by more reference blocks is an error.

wäre für einen Hinweiß sehr dankbar


Gruß
Derak
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 20.11.2008, 19:41     Titel:
  Antworten mit Zitat      
Hallo Derak,

soweit ich das sehe, geht das nur über einen Umweg:

Code:
A = [reginp2.Centroid];
[AVal AInd] = sort(A(2,:));
reginp2 = A(:,AInd);


Aber ich lass mich auch gern von anderen berichtigen. Smile Eine Anmerkung hätte ich noch: Die Felder von reginp2 sind nach dem normalen Sprachgebrauch Area und Centroid (auf englisch field). Das hatte mich zuerst verwirrt. Das, was Du meinst, hat leider keinen so schönen Namen. Man kann sagen: reginp2 ist ein 4x1-struct, oder ist ein sruct-Vektor mit vier Elementen. Ich weiß, dass array auch Feld heißt, aber meist belässt man es bei array.

Willst Du wirklich im letzten Schritt das ganze reginp2 überschreiben?

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Derak
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 23.10.08
Wohnort: BZ
Version: R14
     Beitrag Verfasst am: 21.11.2008, 09:54     Titel:
  Antworten mit Zitat      
Hallo Bijick,

danke erstmal für die vielen Hilfestellungen und Erklärungen. Wie gesagt beschäftige mich noch nicht all zu lang mit Matlab und hab da meist noch Probleme mit den Begriffen Laughing

Hab deine Variante ausprobiert. Doch leider kommt nun folgende Fehlermeldung:

??? Index exceeds matrix dimensions.

schreibe ich folgendes, also schreibe anstatt der 2 eine 1

Code:

A = [reginp2.Centroid];
[AVal AInd] = sort(A(1,:));
reginp2 = A(:,AInd);
 


legt er mir einen 1x20 Vektor an wo alle X und Y-Werte zwar sortiert aber untereinander gemischt sind. Würde nachher gern wieder ein 4x1 Struct haben wollen, deswegen überschreibe ich ja auch reginp2.
Um deine Frage zu beantworten. Nein es ist nicht zwingend notwendig reginp2 zu überschreiben. es kann auch eine andere Variable angelegt werden. Wird dann zwar schwer die ganzen Variablen(25) auseinander zu halten aber das passt schon Wink

Danke nochmal für deine Mühe

P.s. Structe scheinen doch etwas schwieriger zu sein als ich dachte

Gruß
Derak
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 21.11.2008, 11:51     Titel:
  Antworten mit Zitat      
Hallo Derak,

welche Größe hat denn A? Also was ergibt

Code:


Und welches davon sind die x-, welches die y-Werte?

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Derak
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 23.10.08
Wohnort: BZ
Version: R14
     Beitrag Verfasst am: 21.11.2008, 13:06     Titel:
  Antworten mit Zitat      
Hallo Bijick

also bei size(A) sagt er mir 1x20

wenn ich mir A anschaue dann gehören immer 2 aufeinander folgende Werte zusammen.

Also
A(1,1) = X-Wert vom ersten Paar, A(1,2) = Y-Wert von ersten Paar,
A(1,3) = X-Wert vom zweiten Paar,A(1,4) = Y-Wert vom zweiten Paar

Ich hoffe das hilft weiter.

Gruß
Derak
Private Nachricht senden Benutzer-Profile anzeigen
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.11.2008, 14:10     Titel:
  Antworten mit Zitat      
Hallo,

Code:
A = cat(1,reginp2.Centroid);
sollte dir weiterhelfen. Du kannst auch
Code:
anstelle von "sort" benutzen.

MfG
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 - 2024 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.