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

Adressierung unbekannter, variabler Felder in Structure

 

nealz
Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 04.02.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.03.2015, 15:16     Titel: Adressierung unbekannter, variabler Felder in Structure
  Antworten mit Zitat      
Guten Tag,

hier mein Problemchen:


Ich möchte ein bestimmtes Feld in einer Structure adressieren, kenne aber nur die Ersten Buchstaben des Feldes, aber nicht die Endung.
Die Endung ist in diesem Falle egal.

Hier der Code:

Code:


signalname='aaa';
% Ist im Original variabel und unbekannt!

names=fieldnames(structure.step_one.step_two);
% enthält mehrere signalnames, u.a. den gesuchten
% allerdings haben diese names wiederum variable und unbekannte Namensendungen '_t01' oder '_t02' usw.... (für unterschiedliche Zeitkanäle)
% nun will ich den einen passenden Kanal adressieren

for ii=1:length(names)
  strcmp(signalname (end+4), names{ii});
  auswahl_vec=structure.step_one.step_two.signalname;
end

 


Meine Frage ist nun: was schreibe ich hier an letzter Stelle anstatt "signalname"?

(Der Code soll nur meine Problembeschreibung unterstützen und funktioniert natürlich nicht....)

Wie gesagt, die ersten Buchstaben des passenden Signals kenne ich, die Endung ist mir unbekannt.
Ich will den zugehörigen Vektor zu dem Signal aus der Structure extrahieren.

Gibt´s da einen Trick mit "strcmp" oder über (end+4) oder irgendwie sowas?

Ich stecke seit geraumer Zeit fest :-/

Vielen Dank im Voraus!

Nealz
Private Nachricht senden Benutzer-Profile anzeigen


stealth_mx
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 94
Anmeldedatum: 15.06.13
Wohnort: ---
Version: 2013b
     Beitrag Verfasst am: 09.03.2015, 15:58     Titel:
  Antworten mit Zitat      
Du kannst dir ja den Namen dynamisch zusammenbauen.

So in etwa:

Code:
auswahl_vec=structure.step_one.step_two.(strcat('NameDenDuImStructGefundenHast','_deineEndung'));


Das finden ist nicht schwer kannst
Code:
dafür verwenden um an den gesuchten Namen zu kommen.


Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
nealz
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 04.02.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.03.2015, 17:18     Titel:
  Antworten mit Zitat      
Hi,

vielen Dank für die Antwort! Leider habe ich es noch nicht geschafft, diese in etwas brauchbares umzumünzen.

Nochmal zur Klärung:

Über eine GUI kann ich verschiedene Signale auswählen.
Ich wähle also z.B. das Sginal 'Temperatur' aus.

Nun geht es weiter und ich möchte in einer Struktur, in der mehrere verschiedene Dateien mit Vektoren enthalten sind, jeweils von jeder Datei das Signal "Temperatur" heraus ziehen.

Dabei beinhaltet das Sginal "Temperatur" stets noch eine Endung, die auf einen Zeitvektor verweist. Dieser ist mir unbekannt.

Der Code soll automatisch laufen und nicht manuell, weshalb auch der der String 'Temperatur' (hier ja nur als Beispiel) variabel gestaltet und adressiert werden soll:

Code:

selected_channel=get(GUI.listbox_channels,'String');
% selected_channel beinhaltet also meine Signalbenennung

f=fieldnames(struct.step_one.(verschiedene_dateien{c,1});
K = strfind(f,selected_channel);

% Damit gibt mir K an, an welcher Stelle in der Datei der Vektor ist, den ich haben möchte


 


Sorry, mit strcmp wusste ich gerade keine Lösung auf mein Problem, könntest du das nochmal näher erklären?

Könnte ich alternativ über den gerade genannten Weg mit strfind irgendwie eine Indizierung vornehmen, sodass ich dann mit
Code:

auswahl_vec=struct.step_one.(verschiedene_dateien{c,1}).(f{k,1})
 

an den Vektor komme?

Denn
Code:

K=strfind(...)
% ergibt beispielsweise
K=
[]
[]
[1]
[]
 


Bin für jede Hilfe dankbar!
Private Nachricht senden Benutzer-Profile anzeigen
 
stealth_mx
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 94
Anmeldedatum: 15.06.13
Wohnort: ---
Version: 2013b
     Beitrag Verfasst am: 09.03.2015, 17:39     Titel:
  Antworten mit Zitat      
Hi, erstmal solltest du nicht
Code:
verwenden.

struct ist bereits eine von Matlab geschrieben Methode, die ein Struct erstellt. So kann man sich böse die Standardfunktionen überschreiben und dann lange nach dem Fehler suchen.

Was genau ist in einer Funktion das c?
Code:
f=fieldnames(struct.step_one.(verschiedene_dateien{c,1});


Hier fehlen übrigens klammern. Außerdem wendest du fieldnames eigentlich auf ein Struct an um so die Feldnamen zu erhalten. Dh. Es müsste so eine Struktur haben:

Code:
f = fieldnames(DeinStruct.step_one.verschiedeneDaten)


Was genau bezweckst du mit dem {c,1}?


Mit
Code:
kannst du z.B. in Feldern nach Strings suchen.
Private Nachricht senden Benutzer-Profile anzeigen
 
stealth_mx
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 94
Anmeldedatum: 15.06.13
Wohnort: ---
Version: 2013b
     Beitrag Verfasst am: 09.03.2015, 17:47     Titel:
  Antworten mit Zitat      
Also ein kleines Beispiel:

Wenn ich dich richtig verstanden habe:

Code:
% Ein Struct
Computer.Maus = 1;
Computer.Tastatur = 1;
Computer.Drucker = 0;
Computer.Bildschirm = 1;

% Suchen nach einem partiellen String 'Tast'
ergebnis = findstr(fieldnames(Computer),'Tast');


Ergebnis ist ein Cellarray mit folgender Belegung

Code:
ergebnis = {[0];[1];[0];[0]}


jetzt weißt du z.B wo sich 'Tast' befindet.
Private Nachricht senden Benutzer-Profile anzeigen
 
nealz
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 04.02.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.03.2015, 17:58     Titel:
  Antworten mit Zitat      
Hi,

danke für deine Zeit. Ich habe gerade nicht sonderlich auf den Syntax geachtet, denn mir ging es um das generelle Vorgehen.

Ich hole einfach mal weiter aus, dann müsste das Problem deutlicher werden:

Code:

selected_channel=get(GUI.listbox_channels,'String');

kampagnen=fieldnames(g.wuerfel);
        for i_kamp=1:length(kampagnen)
        fzgnames=fieldnames(g.wuerfel.(kampagnen{i_kamp,1}));
           for i_fzg=1:length(fzgnames)
               if strcmp(fzgnames{i_fzg},selected_fzgname)
                dateinamen=fieldnames(g.wuerfel.(kampagnen{i_kamp,1}).(fzgnames{i_fzg,1}));
                plot_vec=g.wuerfel.(kampagnen{i_kamp,1}).(fzgnames{i_fzg,1}).(dateinamen{c,1}).fzg_xpp_t01;
 


Das fzg.xpp_t01 am Ende habe ich noch manuell im Code stehen, da ich hier nicht weiter gekommen bin und erstmal nachgelagerte Funktionen erstellt habe um die generelle Funktionsweise herzustellen.

Ich möchte das 'fzg.xpp_t01' aber variabel adressieren, wobei NUR IN DIESEM FALLE gilt:
Code:

selected_channel='fzg.xpp'
 


Das _t01 ist der bereits erwähnt Zeitkanal IN DIESEM FALLE.
Sowohl selected_channel als auch die Endung ist so gesehen unbekannt und jedes mal anders.

Wenn ich es so mache wie in deinem Beispiel, weiß das Programm, wo der gesuchte Vektor ist.
Kannst du mir sagen, wie ich diese Information dann automatisch in eine geeignete Indizierung umwandel? Also wie vorhin geschrieben dann in einer Adressierung über diese Form:

Code:

auswahl_vec=g.wuerfel.(kampagnen{i_kamp,1}).(fzgnames{i_fzg,1}).f(geeignete_Indizierung);
 


??

Danke Dir!
Private Nachricht senden Benutzer-Profile anzeigen
 
stealth_mx
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 94
Anmeldedatum: 15.06.13
Wohnort: ---
Version: 2013b
     Beitrag Verfasst am: 09.03.2015, 18:02     Titel:
  Antworten mit Zitat      
Ich würde dir aber eher raten ein Struct sinnvoller anzulegen, sodass du nicht ständig nach Strings suchen, bzw. die String auseinanderreißen musst, um an die Information zu kommen.

Also z.B.
Code:

DeinStruct.DatenSatz1.Temperatur.Zeitverlauf
DeinStruct.DatenSatz2.Temperatur.Zeitverlauf


usw.

Geht natürlich nicht immer aber falls du eine ähnliche Stuktur aufbauen kannst sparst du dir eventuell ne Menge arbeit. So kannst du bequem auf alles zugreifen. Du gibst in dem Fall der Temperatur verschiedene Felder. z.B. einen zeitlichen Verlauf.
Private Nachricht senden Benutzer-Profile anzeigen
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 09.03.2015, 18:03     Titel:
  Antworten mit Zitat      
Hallo,

Code:
s.aaa_1 = 12;
s.bbb_1 = 11;
s.ccc_1 = 13;
signalname='aaa';
names=fieldnames(s);

sz = size(names);
log = false(sz);   % pre-allocate
for ii = 1:sz(1)
    log(ii) = strcmp(signalname, names{ii}(1:size(signalname, 2)));
end

auswahl_vec = s.(names{find(log)});

Hilft das?

Grüße,
Seban
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
nealz
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 04.02.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.03.2015, 19:05     Titel:
  Antworten mit Zitat      
Hi,

Ja das hilft! Super, vielen Dank!

@stealth_mx: Ich habe in einer vorgelagerten Anwendung extra aus einem großen Datenpool einen Datenwuerfel in einer Structure zusammengetragen.
Daher diese Struktur....


Nun würde ich euch gern noch ein mal um Hilfe bitte:

Code:

dateinamen=fieldnames(g.wuerfel.(kampagnen{i_kamp,1}).(fzgnames{i_fzg,1}));
                sig_names=fieldnames(g.wuerfel.(kampagnen{i_kamp,1}).(fzgnames{i_fzg,1}).(dateinamen{i_fzg,1}))
                sz=size(sig_names);
                for ii=1:sz(1)
                    log(ii) = strcmp(selected_channel, sig_names{ii}(1:size(selected_channel, 2)));
                end
                plot_vec=g.wuerfel.(kampagnen{i_kamp,1}).(fzgnames{i_fzg,1}).(dateinamen{c,1}).(sig_names{find(log)});
               
                zeitkanal='allg_t';
                for ii=1:sz(1)
                    log(ii) = strcmp(zeitkanal, sig_names{ii}(1:size(zeitkanal, 2)));
                end              
                time=g.wuerfel.(kampagnen{i_kamp,1}).(fzgnames{i_fzg,1}).(dateinamen{c,1}).(sig_names{find(log)});

 


Leider bekomme ich beim letzten Schritt einen Fehler, denn es liegen oft mehrere Zeitvektoren vor, also zum Beispiel
allg_t01
allg_t02
allg_t03
... usw

Ich muss aber genau den passenden heraus fischen.
Dafür brauche ich also die Endung des Signals von vorher, denn ansonsten erfüllen mehrere Vektoren die logische Bedingung...

Wie kann ich mir denn den Namen eines Vektors als String geben lassen? Da ich nun weiß wo der Vektor ist, müsste das doch machbar sein?

Mit num2str jedenfalls scheint es nicht zu funktionieren...

Vielen Dank!
Private Nachricht senden Benutzer-Profile anzeigen
 
nealz
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 04.02.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.03.2015, 10:42     Titel:
  Antworten mit Zitat      
Ich formuliere das Problem noch einmal um, dann wird es eindeutiger:

Ich habe eine Structure, extrahiere mit fieldnames die Felder und möchte nun eine Variable mit dem Namen eines bestimmten Feldes als String erzeugen.

Code:

c.aaa=[1 1 1];
c.bbb=[4 4 4];
c.fff=[2 2 2];

f=fieldnames(c);

% Nun möchte ich die Bezeichnung eines bestimmten Feldes, z.B. des zweiten Feldes (bbb) als String in einer Variablen erzeugen

 


Könnt ihr mir sagen, ob und wie das geht?


Danke!!!
Private Nachricht senden Benutzer-Profile anzeigen
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 11.03.2015, 10:50     Titel:
  Antworten mit Zitat      
Hi,

Code:
c.aaa=[1 1 1];
c.bbb=[4 4 4];
c.fff=[2 2 2];

f=fieldnames(c);
str = f{2};

http://de.mathworks.com/help/matlab.....data-in-a-cell-array.html

Grüße,
Seban
_________________

Richtig fragen
Debugging
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: 11.03.2015, 10:58     Titel:
  Antworten mit Zitat      
Hallo nealz,

Zitat:
Ich habe eine Structure, extrahiere mit fieldnames die Felder und möchte nun eine Variable mit dem Namen eines bestimmten Feldes als String erzeugen.

Ich verstehe noch nicht, was Du als Ergebnis haben möchtest. Was ist "eine Variable als String erzeugen"?

Auich das hilft mir nicht weiter:
Zitat:
% Nun möchte ich die Bezeichnung eines bestimmten Feldes, z.B. des zweiten Feldes (bbb) als String in einer Variablen erzeugen

Möchtest Du die Variable "bbb" erzeugen und wenn ja, mit welchem Inhalt? Dem gleichen wie "c.bbb"?

Falls ja, ist das eine ausgesprochen schlechte Idee. Das dynamische Erzeugen von Variablen behindert das Debuggen brutal und macht die Ausführung des Codes massiv langsamer - das kann auch schon mal ein Faktor 100 sein. Die Variable ist als Feld in einem Struct sehr effizient und sauber aufgehoben. Die dynamische Erzeugung mit EVAL oder ASSIGNIN ist dagegen tückisch und hat eindeutige Nachteile.

Ein nettes Beispiel:
Code:
S.rand = 1:10;
f = fieldnames(S);
eval(sprintf('%s = S.(%s);', f{1}, f{1}));
% Also: "rand = S.rand;" wird ausgeführt

x = rand(2);

Was ist nun "x"? In einigen Matlab Versionen ist x im Normal-Modus nun eine zufällige 2x2-Matrix, während es im Debug-Modus, bei dem Matlab Zeile für Zeile abarbeitet auf 2 gesetzt wird. Es gibt nicht gruseligeres als Programme, die im debug-Modus grundsätzlich anders arbeiten!

Variablen-Namen wie "allg_t03" sind ein typischen Beispiel dafür, dass Programm-Informationen wie ein Index im Namen der Variablen versteckt werden. Ein (Cell-) Array ist in solchen Fällen immer besser.

Gruß, Jan
[/code]
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.