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

string als Variablenname

 

mr90

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.10.2011, 11:54     Titel: string als Variablenname
  Antworten mit Zitat      
Hallo

Ich habe folgendes whs sehr einfaches Problem. Mir liegt der Variablenname als String vor. Nachdem ich mich das Netz und die Help durchstöbert habe, scheint es als könnte man das Probelm mit assignin lösen. Leider schaffe ich es nicht das mein Programm wie gewünscht funktioniert.

Vereinfacht dargestellt sieht mein Programmcode folgendermaßen aus.

Code:

str = {'var'}
str = cell2mat(str);
val = 50;
assignin('caller', str, val)
var %Hier schreibt Matlab, das die Variable nicht existiert
 


In diesem Fall scheint die cell2mat Konvertierung sinnlos, in meinem Programm muss ich das allerdings machen.

Dieser Code befindet sich in einem Callback einer GUI. Wenn ich den Code im Comand Window von Matlab ausführe funktioniert es einwandfrei.

Vielen Dank für eure Hilfe


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 04.10.2011, 13:07     Titel: Re: string als Variablenname
  Antworten mit Zitat      
Hallo mr90,

Wenn Du lange das Netz durchstöbert hast, sind Dir bestimmt auch einige meiner mehreren hundert Warnungen bzgl. EVAL und ASSIGNIN in diesem Forum aufgefallen. Beide Befehle führen immer wieder, wie ja auch in Deinem Fall, zu Schwierigkeiten. Zudem erschweren sie MATLAB die Arbeit, so dass der Code nicht effizient ausgeführt werden kann.

Du hast z.B. in Deinem Beispiel versucht, die existierende Funktion "var" mit einer Variablen zu überschreiben. Wären das M-File gelesen wird, glaub MATLAB, dass "var" der Funktion ist und optimiert den Code entsprechend. Während der Laufzeit wird das Symbol "var" dann aber von einer Variablen überschrieben. Das kann dazu führen, dass im Debug-Modus anderer Code ausgeführt wird, als im normalen Modus. Brrr.

Der Fehler in Deinem Code liegt darin, dass ASSIGNIN('caller') die Variable im Workspace der aufrufenden Funktion definiert, nicht aber innerhalb der Funktion selbst. Dann wäre EVAL also besser. Aber wie schon gesagt und selbst bemerkt: Solche Methoden erzeugen weit aus mehr Probleme als sie lösen. Ein Struct wäre effizienter, klarer und sicherer:
Code:
str = {'var'};
val = 50;
Data.(str{1}) = val;

"str{1}" ist übrigens deutlich effizienter als CELL2MAT.

Noch eine Bemerkung:
Zitat:
var %Hier schreibt Matlab, das die Variable nicht existiert

Bitte poste immer die komplette Fehlermeldung. Ich bekomme z.B. die Meldung "Input agrument "x" is undefined. Error in var at 55, if isinteger(x)". Das ist aber etwas ganz anderes als "dass die Variable nicht existiert". Die Fehlermeldungen enthalten fast immer sehr gute Hinweise, wie man das Problem lösen kann.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
mr90

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.10.2011, 15:33     Titel: Herzlich Dank
  Antworten mit Zitat      
Herzlichen Dank für die Erklärung und deine Tipps.

Hab tatsächlich viele Warnungen in Bezug auf asignin gelesen.
Allerdings hab ich mir gedacht probieren geht über studieren.^^

Durch deinen Tipp mit dem struct hab ich mein Problem jetzt gelöst.

Vielen Dank nochmal

lg
mr90
 
Maschi87
Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 22.12.11
Wohnort: Im Wald
Version: ---
     Beitrag Verfasst am: 23.10.2012, 15:39     Titel:
  Antworten mit Zitat      
Hi,

ich versuche gerade eure Lösung zu verwenden, allerdings müsste ich den ersten Teil des Strukturnamens variieren. Das funktioniert dann aber leider nicht auf dem Weg. Hat da jemand eine Idee wie das gehen könnte?
So klappt es bei mir leider nicht.

Code:

str = {'bla9'};
(str{1}).A
 


Gruß[/code]
Private Nachricht senden Benutzer-Profile anzeigen
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.10.2012, 18:54     Titel:
  Antworten mit Zitat      
Hallo Maschi,

wie Jan schon damals geschrieben hat, ist es besser statt Variablennamen die Felder
eines Structs per String zu erzeugen. In Deinem Fall handelt es sich aber eben nicht
um einen Feldnamen.
Besser so:
Code:
str = {'bla9'};
Data.(str{1}).A = xyz;


Grüße
Sirius
Private Nachricht senden Benutzer-Profile anzeigen
 
Maschi87
Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 22.12.11
Wohnort: Im Wald
Version: ---
     Beitrag Verfasst am: 25.10.2012, 14:19     Titel:
  Antworten mit Zitat      
Ok

damit kann ich das Problem umgehen.

Jetzt suche ich noch nach dem Umgekehrten Fall.
Ich möchte aus einem Feld in der Struktur einen String machen um den dann aus zu geben. Also nicht den Wert des Feldes als String bekommen, sondern den Namen des Feldes und auch nur des Feldes und nicht der ganzen Struktur vorher.

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
dmjr
Forum-Century

Forum-Century


Beiträge: 199
Anmeldedatum: 02.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.10.2012, 14:29     Titel:
  Antworten mit Zitat      
Kannst du mal nen Beispiel geben wie das gemeint ist?
Wenn du auf ein Feld zugreifst, hast du den Namen doch schon.
Private Nachricht senden Benutzer-Profile anzeigen
 
Maschi87
Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 22.12.11
Wohnort: Im Wald
Version: ---
     Beitrag Verfasst am: 25.10.2012, 14:44     Titel:
  Antworten mit Zitat      
z.B. eine Struktur

Code:
Name.Musterman.Max = 12;

% Dann brauche ich einen String

a = 'Musterman'

 


Und das ganze soll später in einer Funktion so laufen, dass ich immer wieder Strukturen übergebe, und dann den String 'Musterman' bekomme.
So wie ich mit
Code:
b=num2str(Name.Musterman.Max);
 


b=12 bekommen würde.
Nur dass ich den Namen brauch und nicht den Wert
Private Nachricht senden Benutzer-Profile anzeigen
 
Maschi87
Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 22.12.11
Wohnort: Im Wald
Version: ---
     Beitrag Verfasst am: 25.10.2012, 14:52     Titel:
  Antworten mit Zitat      
OK
hab es gearde selber gefunden.

Funktioniert mit
Code:
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 25.10.2012, 15:05     Titel:
  Antworten mit Zitat      
Hallo Maschi87,

Code:
Name.Musterman.Max = 12;
FieldName = fieldnames(Name);
disp(FieldName{1});

Gruß, Jan
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.