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 suchen

 

metacircle
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 14.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.09.2011, 10:25     Titel: Variablennamen suchen
  Antworten mit Zitat      
Hallo,

ich habe folgendes Problem. Ich lese mit Matlab Messdateien ein. Die Messdateien werden mit der Messsoftware als Matlab Files exportiert.

Das Problem ist, dass je nach Messung die Signale unterschiedlich benannt werden von dem Export Tools.

Ich habe z.B. in Messung 1:
Signal_A_t1
Signal_B_t10

In Messung 2 könnte es so aussehen:
Signal_A_t5
Signal_B_t11

Gibt es eine Möglichkeit die Daten so zu verarbeiten, dass ich in meinem Skript nach der Variablen die im Namen "Signal_A" beinhaltet suchen kann und immer die richtige Variable finde?
Private Nachricht senden Benutzer-Profile anzeigen


_Peter_
Moderator

Moderator


Beiträge: 537
Anmeldedatum: 08.12.10
Wohnort: ---
Version: 7.10, 2010a
     Beitrag Verfasst am: 14.09.2011, 10:47     Titel:
  Antworten mit Zitat      
Hallo metacircle,
schau dir mal den Befehel
Code:
an. Dieser gibt dir eine Liste der Variablen im Workspace. Dann kannst du mit einem stringvergleich nach deinen Variablen suchen.
_________________

Gruß
Peter
_________________
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht? Oder der MATLAB Hilfe?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
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: 14.09.2011, 12:04     Titel: Re: Variablennamen suchen
  Antworten mit Zitat      
Hallo metacircle,

Die Signale unterschiedlich zu benennen ist ausgesprochen hinderlich, wie Du ja bereits bemerkt hast.
Liest Du die Daten aus einem MAT File? Dann könntest Du dies versuchen:
Code:
Data = load(MatFileName);
Name = fieldnames(Data);
A_index = strncmp(Name, 'Signal_A');
Signal_A = Data.Name{A_Index};

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
metacircle
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 14.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.09.2011, 12:33     Titel:
  Antworten mit Zitat      
Hallo ihr beiden,

bin heute erst dazu gekommen die Dinge umzusetzen, gab noch etliche andere Baustellen.

Ich bin schon auf dem richtigen Weg damit, leider funktioniert die vorgeschlagene Lösung von Jan S so nicht, das Feld

Code:
Data.Name{A_Index}


liefert

Code:
??? Reference to non-existent field 'Name'.


klar, das Feld gibt es so auch nicht.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.09.2011, 12:36     Titel:
  Antworten mit Zitat      
Hallo,

probiers mal so:
Code:
Data.(Name{A_Index})


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
metacircle
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 14.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.09.2011, 12:53     Titel:
  Antworten mit Zitat      
Hi Harald,

gerade wollte ich posten das ich es so hinbekommen habe Smile

Danke
Private Nachricht senden Benutzer-Profile anzeigen
 
TBidi
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 26.09.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.09.2016, 15:08     Titel: Suchen von Variablen per "Teil" des Variablennamen
  Antworten mit Zitat      
Hi zusammen,

ich stehe vor dem selben Problem. Da mein Messprogramm ebenso die Variablennamen bestimmter Signale ja nach Messaufbau (Fahrzeug) teilweise anders benennt, muss ich nach den benötigten Variablen im Workspace bzw. der Struktur suchen.

Bsp.:

Messung 1:

a_x_lenkrad_l_t1
a_y_lenkrad_l_t1
...

Messung 2:
CMD00_a_x_lenkrad_l_t0
CMD00_a_y_lenkrad_l_t0
...


Der bereits vorgeschlagene Lösungsweg funktioniert bei mir leider nicht...

Code:
>> Data = ws2strct(); %WS to Struct
>> Name = fieldnames(Data);
A_index = strncmp(Name, 'a_x_lenkrad_l');
Signal_A = Data.(Name{A_Index});
??? Error using ==> strncmp
Not enough input arguments.
 


Hat jemand eine Lösung dazu? Vielen Dank!

LG

TBidi
Private Nachricht senden Benutzer-Profile anzeigen
 
TBidi
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 26.09.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.09.2016, 15:13     Titel:
  Antworten mit Zitat      
Hi nochmal,

ein weiterer Lösungsansatz ist, dass ich mir die Namen der gesuchten Variablen per "who" suche. Dann habe ich eine neue Variable mit dem richtigen Variblenname der gesuchten Var als Value der neuen Var. Wie kann ich nun mit dieser Info weiterarbeiten? Ich bin sehr dankbar über Lösungen und Ideen!

Bsp::
Code:
>> Name_a_x_l = who('-regexp','a_x_lenkrad_l')

Name_a_x_l =

    'a_x_lenkrad_l_t2'


Vielen Dank und viele Grüße

TBidi
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: 26.09.2016, 17:21     Titel: Re: Suchen von Variablen per "Teil" des Variablenn
  Antworten mit Zitat      
Hallo TBidi,

Wieso funktioniert der Vorschlag bei Dir nicht?
Wie kommen denn die Variablen in Deinen Workspace? Per load ? Dann müsste man einfach nur den Output von load in einer Variablen speichern und schon wäre wieder alles sauber und effizient.

Wenn man seinen Workspace dynamisch mit Variablen flutet, kann es vorkommen, dass eine Variable genau so heißt, wie das Script, das man aufrufen möchte. Und ab da geht gar nichts mehr.

Code:
>> Data = ws2strct(); %WS to Struct
>> Name = fieldnames(Data);
A_index = strncmp(Name, 'a_x_lenkrad_l');

Du benötigst strcmp , nicht strncmp , denn letzteres benötigt als 3. Input die Anzahl der zu vergleichenden Buchstaben.

Die Fehlermeldung ist da hilfreich, wenn man sie liest ;-)

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
TBidi
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 26.09.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.09.2016, 18:14     Titel:
  Antworten mit Zitat      
Hi Jan,

vielen Dank für deine rasche Antwort und entschuldige, ich habe den falschen Code eingestellt Rolling Eyes

Ich lade die Datei per uigetfile() um die Möglichkeit unter wechselnden Namen angelegte Messungen auswerten zu können. (unübersichtlicher Nutzerkreis des Skripts in Zukunft). Es müsste doch möglich sein, die gesuchten Variblen per gleichbleibenden "Namensstamm" (*a_x_lenkrad_l_*) zu finden und zu verwenden?!

Bsp. für die richtige Fehlermeldung:
Code:
[FileName,PathName] = uigetfile('...\Matlab\', 'Datensatz 1. Messung wählen');

load(strcat(FileName));

Data = ws2strct();
clearvars -except Data;
Name = fieldnames(Data);
A_index = strcmp(Name, 'a_x_lenkrad_l');
Signal_A = Data.(Name{A_Index});
??? Undefined function or variable 'A_Index'.


Code:
[FileName,PathName] = uigetfile('...\Matlab\', 'Datensatz 1. Messung wählen');

load(strcat(FileName));

Data = ws2strct();
clearvars -except Data;
Name = fieldnames(Data);
A_index = strncmp(Name, 'a_x_lenkrad_l', 10);
Signal_A = Data.(Name{A_Index});
??? Undefined function or variable 'A_Index'.
 


Das Struct bilde ich über folgende Funktion:
Code:
function WStruct=ws2struct()

WSVARS = evalin('base', 'who');
for wscon=1:size(WSVARS,1)
    thisvar=evalin('base', WSVARS{wscon});
    eval(strcat('THEWORKSPACE.(WSVARS{wscon})=thisvar;'))
end

WStruct=THEWORKSPACE;
 


Grüße

TBidi

PS: Das selbe Problem tritt auch auf wenn ich "clearvars -except Data;" weglasse...
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.09.2016, 17:13     Titel:
  Antworten mit Zitat      
Hallo TBidi,

Zitat:
Es müsste doch möglich sein, die gesuchten Variblen per gleichbleibenden "Namensstamm" (*a_x_lenkrad_l_*) zu finden und zu verwenden?!

Na klar, möglich ist das schon. Aber viel zu umständlich und fehleranfällig. Es ist eine Standard-Quelle für Bugs, und deshlab sollte man das unbedingt lassen.

Das Problem fängt bereits hier an:
Code:
[FileName,PathName] = uigetfile('...\Matlab\', 'Datensatz 1. Messung wählen');
load(strcat(FileName));

Das schreibt bereits unkontrolliert Variablen in den Workspace. Nebenbei fehlt auch noch der Pfad-Name, so dass das strcat nutzlos ist.

Besser:
Code:
[FileName,PathName] = uigetfile('...\Matlab\', 'Datensatz 1. Messung wählen');
Data = load(fullfile(PathName, FileName));

Jetzt sind alle Input-Daten sicher und eindeutig im Struct "Data" gespeichert, ohne dass man dreckig tückische Methoden wie in W2STRUCT verwenden muss.

Hast Du Dir die Fehlermeldung durchgelesen?
Zitat:
??? Undefined function or variable 'A_Index'.

Du hast "A_index" mit kleinem "i" definiert.

Nebenbei geht der Zugriff auf die Struct-Felder doch auch direkt:
Code:
Data.a_x_lenkrad_l
% Oder:
Name = 'a_x_lenkrad_l';
Data.(Name)
 

Wozu brauchst Du den Umweg über das strcmp ?

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