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?
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
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.
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)
kampagnen=fieldnames(g.wuerfel);
for i_kamp=1:length(kampagnen)
fzgnames=fieldnames(g.wuerfel.(kampagnen{i_kamp,1}));
for i_fzg=1:length(fzgnames) ifstrcmp(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:
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:
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.
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.
@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...
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
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]
Einstellungen und Berechtigungen
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
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.