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

Abfrage ob Variable oder Datei überhaupt vorhanden

 

nitzsche

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.05.2008, 23:14     Titel: Abfrage ob Variable oder Datei überhaupt vorhanden
  Antworten mit Zitat      
Ich habe zwei kleine Anliegen.

Wie kann ich testen ob etwa Variable xyz überhaupt vorhanden ist, also mit dem Namen überhaupt existiert, selbst wenn auch nur als leere syms.

Das gleiche möchte ich mit Dateien realisieren, also z.b. wenn ich per

Code:


Eine Datei aufrufen möchte, aber vorher prüfe, ob sie überhaupt vorhanden ist.


nschlange
Ehrenmitglied

Ehrenmitglied



Beiträge: 1.320
Anmeldedatum: 06.09.07
Wohnort: NRW
Version: R2007b
     Beitrag Verfasst am: 15.05.2008, 07:35     Titel:
  Antworten mit Zitat      
Hi,

ob eine Variable (und einige Dateitypen)existiert kannst Du mit
Code:
prüfen.
Für Dateien kannst Du Dir mit
Code:
oder
Code:
eine Dateiliste des Verzeichnis anlegen und dann gucken, ob die gewünschte Datei da drin ist.
Oder Du benutzt beim Öffnen
Code:

Kommst Du damit weiter?
_________________

Viele Grüße
nschlange

"Chuck Norris ejakuliert fluessigen Stahl!"
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
schweikl_alex

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.08.2008, 17:54     Titel: exist in functions
  Antworten mit Zitat      
Wie kann ich denn in einer function herausfinden, ob im base workspace eine bestimmte variable existiert?

ich habe es mit exist(evalin('base','var')); probiert, ich wollte damit schauen ob es die Variable var im Workspace gibt.


geht das??? brauche dringend Hilfe!!!!
 
nschlange
Ehrenmitglied

Ehrenmitglied



Beiträge: 1.320
Anmeldedatum: 06.09.07
Wohnort: NRW
Version: R2007b
     Beitrag Verfasst am: 07.08.2008, 21:47     Titel:
  Antworten mit Zitat      
Hi,

hier ein paar Vorschläge wie man das machen könnte:
Code:
function findevar
clc;
nameinbase='blabla';

% pruefen ob vorhanden
ret=evalin('base',['exist(''' nameinbase ''')'])

% direkt eine bekannte Variable laden
try
var_lokal=evalin('base',nameinbase);
catch
    disp('geht nicht')
end

% oder eine Liste erzeugen
vars=evalin('base','whos');
for i = 1:length(vars)
    disp(vars(i).name)
end

_________________

Viele Grüße
nschlange

"Chuck Norris ejakuliert fluessigen Stahl!"
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
schweikl_alex

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.08.2008, 08:32     Titel: Danke!!!
  Antworten mit Zitat      
Vielen Dank für die schnelle Antwort!!!

Es funktioniert!!!!
 
Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.10.2010, 14:50     Titel: exist problem
  Antworten mit Zitat      
Hallo,

ich habe ein ähnliches Problem.
Ich versuche mit dem Befehl exist() festzustellen ob eine Variable existiert.
Das ganze sieht dann folgendermaßen aus:

Code:

if(exist('myVar', 'var'))
...
end
 


Damit bekomme ich diese Fehlermeldung:
??? Undefined variable or function myVar might refer to the function myVar.

Mir ist klar das die Variable myVar unter Umständen nicht existiert, aber genau das will ich ja hier abfangen. Was mach ich da falsch?

Grüße
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 12.10.2010, 15:27     Titel:
  Antworten mit Zitat      
Hallo

Eigentlich sollte es genau so funktionieren.

Bist du sicher, dass du Hochkommas in EXIST um myVar gesetzt hast?

Wenn ja, dann kommt der Fehler an Anderer Stelle zu Stande. Schreibt dir Matlab keine Zeile, wo Fehler geschieht? Setzte Debugger an.
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.10.2010, 15:40     Titel:
  Antworten mit Zitat      
Oje, ich hatte tatsächlich die Hochkommas vergessen Wink
Danke.
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 12.10.2010, 22:57     Titel:
  Antworten mit Zitat      
Liebes Forum,

Zwar kommt mein Kommentar mit zwei Jahren Verzögerung. Aber das Problem ist doch immer wieder zu finden:
Code:

nameinbase='blabla';
ret=evalin('base',['exist(''' nameinbase ''')'])
 

EXIST ohne zweiten Input 'var' akzeptiert auch Java-Klassen, M-, P-, Mex- MDL-Files irgendwo im Matlab-PATH, und Ordner.
Deshalb ist "exist('name')" einerseits sehr langsam, und andererseits sehr tückisch. Also besser:
Code:

nameinbase='blabla';
ret=evalin('base',['exist(''', nameinbase, ''', '''var''')'])
 

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.08.2012, 14:56     Titel:
  Antworten mit Zitat      
Kann mir jemand sagen, wie ich "nameinbase" nun als variable einsetze?

Ich möchte den inhalt von "nameinbase" im Workspace überprüfen lassen, quasi nach einer Benutzereingabe.

Leider bekomme ich die Zeile nur so eingerichtet, das Matlab tatsächlich jedes mal auf "nameinbase" überprüft. Danke!
 
mat_macs
Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 27.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.03.2013, 11:56     Titel:
  Antworten mit Zitat      
Das scheint der Thread der zu späten Antworten zu sein Smile
Aber der Vollständigkeit halber meine Antwort auf rabaukes Frage.

Es ist zwar schwierig zu debuggen, funktioniert mit Übung für meine Zwecke allerdings prima:

Code:


Viele Grüße,
Max
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.03.2013, 13:30     Titel:
  Antworten mit Zitat      
Hallo,

es gibt kaum etwas, wofür EVAL wirklich nötig wäre.
Solange es funktioniert, schön. Wenn es aber mal nicht funktioniert, ärgert man sich beim Debuggen gerne maßlos - und würde sich dann wünschen, es ohne EVAL gemacht zu haben.

Oben z.B. hat sich selbst Jan bei EVALIN verhaspelt. Richtig wäre:
Code:
ret=evalin('base',['exist(''', nameinbase, ''', ''var'')'])



Und wenn man nicht in anderen Workspaces sucht (was man vermeiden sollte), ist das EVALIN auch hier unnötig.

Grüße,
Harald
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: 28.03.2013, 20:37     Titel:
  Antworten mit Zitat      
Lieber Harald,

Ich nehme es als implizites Lob, dass "selbst" ich mich bei einem EVALIN-Befehl verhaspelt habe! Das war dann ja praktisch eine Demonstration zur Abschreckung :-)

Zitat:
es gibt kaum etwas, wofür EVAL wirklich nötig wäre.

Das kann ich nur voll und umfassend bestätigen: Es gibt immer eine bessere Lösung als EVAL(IN).

Das einzige Gegenbeispiel, dass mir in den letzten 10 Jahren begegnet ist, war das dynamische Erzeugen von globalen Variablen. Weil dies nicht möglich ist:
Code:
Name = 'myVariable';
global(Name)   % ERROR! No functional form of global() !

braucht man tatsächlich:
Code:
Name = 'myVariable';
eval(['global ', Name])

Aber (natürlich kommt hier ein ABER), globale Variablen dynamisch zu definieren ist eine wirklich doppelt schlechte Idee.

Frohge Ostern, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
mat_macs
Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 27.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.03.2013, 17:03     Titel:
  Antworten mit Zitat      
Hallo Harald und hallo Jan,

ja habe auch schon mehrfach mitbekommen, dass man eval besser vermeiden sollte. Allerdings habe ich z.B. es derzeit mit Strukturen mit z.B. 10 und mehr Feldern zu tun. In Schleifen werden dann verschiedene Abfragen getätigt und Inhalte der Felder in eine andere Struct geschrieben.

Zum Beispiel: examin_area23.Position(1:10,1) sind die ersten 10 Zeilen eines Positionsvektors, der in der ersten Spalte Länge und in der zweiten Breite eingegeben hat. Und der Positionsvektor wird dem Untersuchungsgebiet 23 untergliedert. Allerdings gibt es mehrere examin_area - Structs in meinen zu untersuchenden Datensätzen und je nachdem welcher Positionsbereich für mich relevant ist, ob nun 1:10 oder 3:8 oder 24:47 (ergibt sich aus verschiedenen Bedingungen), muss ich halt an die Inhalte kommen.

Also ist mir (nach wie vor Anfänger und ohne Programmiererfahrung außerhalb von Matlab) nix besseres eingefallen als mit eval zu arbeiten.
Also in meinen Schleifen z.B. derart:

Code:

eval([ 'examin_area' num2str(idx1) '.Pos(idx2:idx3,:);' ]);
 


Es gibt sicher auch andere Möglichkeiten, aber nur um auf die Fragestellung von rabauke zu antworten, habe ich ihm den eval-Befehl als Hinweis geben wollen. Aber ich würde nun auch gern wissen, wie ich meine examin_area - Abfragen ohne eval machen kann, wenn alles dynamisch und in Abhängigkeit von verschiedenen Bedingungen abgefragt bzw. zugewiesen werden soll. Ihr würdet es mit "global" machen?

Frohe Ostern und viele Grüße,
Max
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.03.2013, 23:22     Titel:
  Antworten mit Zitat      
Hallo,

wenn sich die examin_area-Variablen nur durch die angehängte Nummer entscheiden, wäre ein Array solcher Strukturen sinnvoller. Zugriff dann mittels:
Code:
examin_area(idx1)


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.