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

Variablennamen vergleichen und Rest des Strings übernehmen

 

joggel.v
Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 07.12.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.02.2013, 12:58     Titel: Variablennamen vergleichen und Rest des Strings übernehmen
  Antworten mit Zitat      
Hallo Zusammen,
ich lade mir eine größere Menge Variablen in mein Workspace. Je nach Rasterung der Messdaten bekomme ich beim Import eine Endung an meinen Variablennamen gehängt.

So erhalte ich z.B nach dem Import den Namen:
LaunchControl_r_1 (für 100ms Rasterung)
LaunchControl_r_2 (für 100ms Rasterung)

Dameine Berechnungen für alle Zeitraster funktionieren soll, interessiert mich nur der erste Teil des Namens nämlich:

LaunchControl_r

Wie schaffe ich es, dass meine definierte Rechengröße, hier z.B. A immer die richtige Variable benutzt.

Also aus:
A=LaunchControl_r

soll sich Matlab automatisch das vorhandene Signal suchen:
A=LaunchControl_r_1
oder ggf.
A=LaunchControl_r_2


Habe es schon mit findstr versucht, kam aber zu keinem Ergebnis.

Über eure Hilfe würde ich mich freuen.
Gruß Jörg
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

wie erfolgt der Import? Mit load aus einer .mat-Datei?
Dann können die Daten in eine Struktur geladen werden.
Code:
Die Behandlung verschiedener Feldnamen ist deutlich einfacher als die Behandlung verschiedener Variablennamen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
joggel.v
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 07.12.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.02.2013, 14:17     Titel:
  Antworten mit Zitat      
Hallo Harald,

leider habe ich .dat Files welche ich mit
Code:

% ------------------------------------------------------------------------
% Import der Messung.dat
%  ------------------------------------------------------------------------
clear;
clc;
cd C:\Namel\08\Messungen;

% Messungsnamen anpassen:
[filename]=uigetfile('*.*');

mdfimport(filename);
 


einlese. Habe Gerade schon versucht mit
Code:
s=mdfimport(...);

ein Struct zu erzeugen, erhalte jedoch den Fehler:

Code:
Error in mdfimport (line 47)
if nargin % If arguments past in Output argument "varargout" (and maybe others) not assigned during call to


Eine Idee
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.02.2013, 14:28     Titel:
  Antworten mit Zitat      
Hallo,

ich sehe drei Möglichkeiten:
a) die mdfimport-Funktion anpassen
b) Abfrage der vorhandenen Variablen mit WHOS und Weiterverarbeitung mit EVAL.
c) sofern die Anzahl der möglichen Anhängsel klein ist oder die Anhängsel wenigstens systematisch sind, kann man mit EXIST die Existenz der Variablen abprüfen.

Wenn möglich, würde ich c) verwenden. Ansonsten wäre die sauberere Möglichkeit wohl a), die zumindest zunächst einfachere vermutlich b).

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
joggel.v
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 07.12.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.02.2013, 15:15     Titel:
  Antworten mit Zitat      
Servus,
vielen Dank schon mal für deine Hilfe. Ich habe folgendes versucht:
Code:

s=who;
pos=(regexp(s,'.*LaunchControl'));
pos =  find(~cellfun('isempty',pos));
Soll=s(pos)

 

Jetzt kann ich immerhin schon einmal den längeren Variablennamen LaunchControl_1 erhalten.

Nun müsste ich es doch mit dem EVAL Befehl schaffen, meinen
Code:
Soll = 'LaunchControl_1'
der tatsächlichen Variable 'LaunchControl_1'mit den Zahlenwerten im Workspace zuordnen können oder?

Also in der Art:
Code:
eval(['Soll=Soll'])


Hier hänge ich...
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.02.2013, 15:43     Titel:
  Antworten mit Zitat      
Hallo,

Code:
eval(['Soll = ', Soll. ';'])

sollte gehen.

Hier ist Soll einmal ein String und einmal eine Variable. Aufgrund der Schwierigkeiten, die man sich mit solchen Konstrukten oft einhandelt, würde ich an sich die beiden anderen Lösungen bevorzugen.

Übrigens: statt mit regexp sollte man hier auch mit strncmp arbeiten können. Das finde ich persönlich einfacher.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
joggel.v
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 07.12.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.02.2013, 16:53     Titel:
  Antworten mit Zitat      
Hallo,
ja hab mir schon sagen lassen, dass die Benutzung von EVAL kritisch ist.

Mit deinem Code
Zitat:
eval(['Soll = ', Soll. ';'])

komme ich nicht wirklich weiter.

Ich habe einen Vektor LaunchControl_1 <10123x1 double> und finde mit obigem code und who den vollständigen Namen und weiße den entsprechenden String meinem Soll zu.

Also erhalte ich:
Code:
Soll='VektorLaunchControl_1'


Jetzt will ich mit EVAL dem Soll, also dem String die Variable LaunchControl_1 <10123x1 double> zuweisen.

Es müsste eine Kleinigkeit sein? =) Danke
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.02.2013, 16:57     Titel:
  Antworten mit Zitat      
Hallo,

ein kleiner Schreibfehler (Punkt statt Komma). So sollte es sein:

Code:
eval(['Soll = ', Soll, ';'])


Das müsste meines Erachtens gehen. Wenn nicht, bitte die dabei auftretenden Probleme angeben.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
joggel.v
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 07.12.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.02.2013, 17:36     Titel:
  Antworten mit Zitat      
Hallo,
ich vermute es liegt daran, dass mein Soll ein {}Cell Array ist. Folgenden Fehler schmeißt mir Malab:

Code:
>> eval(['Soll = ', Soll, ';'])
Undefined function 'eval' for input arguments of type 'cell'.


Wie kann ich hier zugreifen? Vielen Dank ud Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
joggel.v
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 07.12.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.02.2013, 17:59     Titel:
  Antworten mit Zitat      
Okay habe den Fehler gefunden:

Es muss heißen:

Code:
Soll=s{pos}
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: 21.02.2013, 20:48     Titel:
  Antworten mit Zitat      
Hallo joggle.v,

Ich nehme an es handelt sich um mdfimport aus dem FileExchange: http://www.mathworks.com/matlabcent.....-import-tool-and-function
Die Daten direkt in den Workspace zu importieren ist offenbar eine schlechte Idee. Es wäre deutlich einfacher, wenn diese Funktion in der Lage wäre, die Ausgabe in ein Struct zu schreiben. Da ich selbst die Funktion nicht modifizieren und hinterher im FEX veröffentlichen möchte, wäre eine Interface-Funktion denkbar:
Code:
function S = myMDFImport(varargin)
mdfimport(varargin{:});
vars___ = who;  % Hopefully the file does not contain a name with 3 underscores
for iVar = 1:numel(vars___)
  aVar = vars___{iVar};
  if strcmp(aVar, genvarname(aVar))
    S.(aVar) = eval(aVar);
  else
    warning('JSimon:myMDFImport:BadVarName', ...
               'Bad name ignored: [%s]', aVar);
  end
end

Danach kann man sicher auf die Felder des Structs zugreifen und es können auch keine lokalen Variablen ausversehen überschrieben werden.
Code:
if Bedingung
  data = S.LaunchControl_r_1;
else
  data = S.LaunchControl_r_2;
end

% Oder:
k = 1;
data = S.(sprintf('LaunchControl_r_%d', k));

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.