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

Strukturvariable mit Zahl verbinden

 

Grünschnabel
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 80
Anmeldedatum: 01.10.13
Wohnort: ---
Version: MATLAB R2013a
     Beitrag Verfasst am: 21.10.2013, 03:21     Titel: Strukturvariable mit Zahl verbinden
  Antworten mit Zitat      
Hallo Zusammen,
ich würde gerne meine Strukturvariablen aus einem String und einem int zusammen setzen, dies gelingt mir aber nicht. Hier ist ein kleines Beispiel, wie ich es erzeugen möchte.
In dem Vektor A stehen die Zahlen, die ich in meiner Strukturvariablen verwenden möchte.


Das Ergebnis soll eingentlich wie folgt aussehen:
Variable.10 = ...
Variable.20 = ...
Variable.300 = ...
Variable.4000 = ...


Code:
A=[10 20 300 4000];
NCols = size (A,2);

 for i=1:NCols  
   [Variable.A(i)] = Funktionsname (Input1, Input2,);
end

 


Kann mir jemand helfen? Es liegt vermutlich daran, dass ich keine int in Strukturvariablen verwenden darf, oder?!? Kann mir jemand bei der Lösung meines Problems helfen?

Vielen Dank für Eure Hilfe
der Grünschnabel
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 21.10.2013, 10:06     Titel:
  Antworten mit Zitat      
Hallo

Feldnamen haben den gleichen Syntax wie die Variablennamen.
Also der Name muss mit einem Buchstaben beginnen, danach können Zahlen und Unterstrich-Zeichen folgen. Keine Sonderzeichen, Satzzeichen, oder Operatoren, wie '+,-,*' sind erlaubt.

Außerdem nutze Dynamische Felder

Code:


A=[10 20 300 4000];
NCols = size (A,2);

for i=1:NCols  
   Variable.(sprintf('f%d', A(i))) = Funktionsname (Input1, Input2,);
end

% oder

for i=1:NCols  
   Variable.(['f', num2str(A(i))] ) = Funktionsname (Input1, Input2,);
end

 


Zuletzt bearbeitet von denny am 21.10.2013, 11:52, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Grünschnabel
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 80
Anmeldedatum: 01.10.13
Wohnort: ---
Version: MATLAB R2013a
     Beitrag Verfasst am: 21.10.2013, 10:24     Titel:
  Antworten mit Zitat      
Hallo denny,
gut zu wissen, dass mein Idee Grundsätzlich nicht möglich ist.

Dann werde ich einen Buchstaben+Zahlen Kombination verwenden. Das ist auch ok und somit ist mein Problem gelöst. Vielen Dank für die schnelle hilfe!!! Very Happy

Der Grünschnabel
Private Nachricht senden Benutzer-Profile anzeigen
 
Grünschnabel
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 80
Anmeldedatum: 01.10.13
Wohnort: ---
Version: MATLAB R2013a
     Beitrag Verfasst am: 21.10.2013, 10:51     Titel:
  Antworten mit Zitat      
Sorry, dass ich nochmal störe aber ich bekomme folgende Warnung, wenn ich den Ansatz in meinen Code einbaue:

??? Warning: Struct field assignment overwrites a value with class "cell".
See MATLAB 7.0.4 Release Notes, Assigning Nonstructure Variables As Structures Displays Warning for details.

Ich arbeite mit folgendem Ansatz:
Code:


 A = [10 20 300 4000; 0.2 3 0.5 6];
 NCols = size (A ,2);

 for i=1:NCols
       Variable.(sprintf('TG_%d', A (1,i))) = Funktionsname ( Input1, Input (2,i) );
end
clear i;
 


Deinen anderen Ansatz habe ich auch getestet aber die Warnung ist die Gleiche.


Ich habe die Hilfe gelesen aber finde keine Lösung. Hat jemand einen Vorschlag?!?

Vielen Dank
der Grünschnabel
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 21.10.2013, 10:56     Titel:
  Antworten mit Zitat      
Hallo

Die Warnung heißt ja, das du Variable schon irgendwo vorher genutzt hast, und diese hatte einen anderen Datentyp

versuche so:
Code:

A = [10 20 300 4000; 0.2 3 0.5 6];
NCols = size (A ,2);

Variable = [];
 for i=1:NCols
       Variable.(sprintf('TG_%d', A (1,i))) = Funktionsname ( Input1, Input (2,i) );
end
clear i;

 


Zuletzt bearbeitet von denny am 21.10.2013, 11:38, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Grünschnabel
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 80
Anmeldedatum: 01.10.13
Wohnort: ---
Version: MATLAB R2013a
     Beitrag Verfasst am: 21.10.2013, 11:09     Titel:
  Antworten mit Zitat      
Wow, die Lösung war so einfach und doch so fern (für mich)!

Code:
Variable = [];


Das war die Lösung für mein Problem.
Vielen Dank du hat mir sehr geholfen!!! Very Happy

Schöne Grüße
der Grünschnabel
Private Nachricht senden Benutzer-Profile anzeigen
 
Grünschnabel
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 80
Anmeldedatum: 01.10.13
Wohnort: ---
Version: MATLAB R2013a
     Beitrag Verfasst am: 22.10.2013, 12:18     Titel:
  Antworten mit Zitat      
Hallo Zusammen,
ich habe eine weitere Frage zur Verwendung von Strukturvariablen.

Ich verwende bis jetzt folgenden Code:

Code:

NCols= 5;
Info.X = 'Land';
Info.Y = 'Name';

 for i = 1 : NCols

     File1 = [ Info.X '_Variable_' , ( NUM2STR (i) ) , '.txt'];                     % Erzeugung eines Filenamens der an eine Funktion übergeben wird
     Var1 = struct ( Info.X, '_', NUM2STR(i), nfo.Y,  'Wert' );                           % Erzeugung einer Struktur in der der Outputwert der Funktion abgespeichert werden soll
   
    [ Var1 ] = Reads_Info ( File1 );                                                         % Die Übergabe von 'File1' funktioniert. Die Funktion "Reads_Info" gibt richtigen Wert zurück.

end


Die Funktion gibt zwar den richtigen Wert wieder, überschreibt aber meine "zuvor erzeugte Struktur" und speichert den Wert unter Var1, nicht aber in einer Struktur.

Mein Ziel ist es, den Rückgabewert der Funktion unter folgender Struktur abzuspeichern:
Land_1.Name.Wert = Rückgabewert 1
Land_2.Name.Wert = Rückgabewert 2
...
Land_5.Name.Wert = Rückgabewert 5



Wie kann ich das Problem lösen, habt ihr eine Idee?!? Confused

Vielen Dank im Voraus.

Der Grünschnabel
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 22.10.2013, 17:28     Titel:
  Antworten mit Zitat      
Hallo

das ist keine gute Idee, den Index in den Namen zu verwenden
besser :

Code:

Land(1).Name.Wert = Rückgabewert1
Land(2).Name.Wert = Rückgabewert2
...
Land(5).Name.Wert = Rückgabewert5

 




so in etwa:
Code:


NCols= 5;
Info.X = 'Land';
Info.Y = 'Name';

% Intialisierung aus Schleife rausholen

Land  = struct(Info.Y, cell(1, NCols))
for i = 1 : NCols

     File1 = [ Info.X '_Variable_' , ( NUM2STR (i) ) , '.txt'];                    
     % um Werte zu schreiben muss du deine Struktur rausschreiben
     % woher soll Matlab wissen, dass du in ein bestimmtes Feld schreiben möchtest.
     Land(i).(Info.Y).Wert = Reads_Info ( File1);  

end

 
Private Nachricht senden Benutzer-Profile anzeigen
 
Grünschnabel
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 80
Anmeldedatum: 01.10.13
Wohnort: ---
Version: MATLAB R2013a
     Beitrag Verfasst am: 23.10.2013, 04:16     Titel:
  Antworten mit Zitat      
Hallo denny,
vielen Dank für Deine schnelle Hilfe. Dein Vorschlag geht in die richtige Richtung, vermutlich muss ich aber meine Fragestellung etwas präzisieren. Sorry...

Ich möchte für eine beliebige Anzahl n je eine Struktur erzeugen, die im Workspace wie folgt erscheint:
Ebene1 . Ebene2 . Ebene3 = Rückgabewert
Land_1 . Name . Wert = Rückgabewert
Land_1 . Größe . Wert = Rückgabewert
Land_1 . Population . Wert = Rückgabewert

Land_2 . Name . Wert = Rückgabewert
Land_2 . Größe . Wert = Rückgabewert
Land_2 . Population . Wert = Rückgabewert
...
Land_n . Name . Wert = Rückgabewert
Land_n . Größe . Wert = Rückgabewert
Land_n . Population . Wert = Rückgabewert


Und so stelle ich mir meine Vorgehensweise vor. Ich lese aus einer Datei eine Information und speichere sie unter der Variable
InfoX = 'Land'
Da es mehrere Datensätze mit gleichem Namen "Land" gibt, möchte ich sie mit dem Index i kennzeichnen um so eine Unterscheidung zu haben. Dies wollte ich wie folgt lösen:
for i:1:5
b = [InfoX '_' (NUM2STR(i))]
end

Des weiteren werden Variablen definiert, die nicht dynamisch sind:
Var1 = 'Name'
Var2 = 'Größe'
Var3 = 'Population'
Var4 = 'Wert'

Ich habe deinen Vorschlag getestet aber der Aufbau der Struktur ist anders.

Ich würde gerne im Worksapce auf "Land_1" klicken und in der nächsten Ebene sollen die Felder Name, Größe, Population angezeigt werden.

Oh je, ist das schwer ein Problem exakt zu beschreiben. Sorry, und vielen Dank für Deine hilfe. Ich versuche es jetzt weiter.

Der Grünschnabel
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 23.10.2013, 12:24     Titel:
  Antworten mit Zitat      
Grünschnabel hat Folgendes geschrieben:

Ich habe deinen Vorschlag getestet aber der Aufbau der Struktur ist anders.

Ich würde gerne im Worksapce auf "Land_1" klicken und in der nächsten Ebene sollen die Felder Name, Größe, Population angezeigt werden.

Oh je, ist das schwer ein Problem exakt zu beschreiben. Sorry, und vielen Dank für Deine hilfe. Ich versuche es jetzt weiter.

Der Grünschnabel


Hallo Grünschnabel
Was du versuchst ist einfach nicht gut, das sollte möglichst vermieden werden. Weil Dynamische Variablen sind einfach zu fehleranfällig und außerdem nicht debuggbar. Wenn du da drin einen Fehler verursachst, wünsche ich dir viel Spaß diesen zu suchen.

Also als erstes musst du bedenken, ob du diese Variablen irgendwo /irgendwann später verwenden möchtest? Wenn ja, dann besser gute Struktur anzulegen, und die Laufzähler verwenden. Das vereinfacht dein Leben.

Wenn du dir nur wg Anschauens einen Klick sparen möchtest, meinetwegen, schaue dir EVAL-Konstrukte an. Benutze dazu die Suchfunktion des Forum wurde hier schon unzählige Male diskutiert.
Private Nachricht senden Benutzer-Profile anzeigen
 
Grünschnabel
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 80
Anmeldedatum: 01.10.13
Wohnort: ---
Version: MATLAB R2013a
     Beitrag Verfasst am: 23.10.2013, 13:09     Titel:
  Antworten mit Zitat      
Hallo denny,
vielen Dank für deine ehrliche Meinung, genau aus diesem Grund hast du den "Rang" eines Supporters und ich lediglich den des Forum-Anfängers... Wink

Ich lasse meinen Ansatz dann besser sein und versuche deinen Lösungsvorschlag sinnvoll in meinen Code zu integrieren. Wenn er dann stabilder und leichter zu durchschauen ist, ist das für mich wirklich sinnvoller.

Vielen Dank.

Beste Grüße aus der Asien in die Heimat,
der Grünschnabel
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.