möchte aber immernoch "einfach" color ändern können.
Setze ich o.g. in den normalen Propertiesabschhnitt kommt
"Undefined variable "obj" or class "obj.color"
Als (Constant) bleibt linespec dann einfach leer (ohne Warnung oder so...).
Gibt es da irgendeinen Weg, ohne eval oder mit indizes im linespec zumzufummeln?
btw.: kann man irgendwie ein cell array als EIN Feld in einem struct ablegen?
_________________
Ich hasse es wenn die Leute Fragen stellen, man dann versucht sich Mühe zu geben, und diejenigen ihren Thread nie wieder besuchen...
Achso!
Ich bin nicht auf die Idee gekommen, mein CellArray erst im Code zu verändern/dem struct hinzuzufügen...
Eigentlich hatte ich wohl sowieso ein anderes Problem, mein Ansatz war:
* in einem Feld soll dass stehen, was ich ohne weiteres an plot übergeben kann (deswegen als CellArray)
* einige Eigenschaften dazu sind fest, d.h. ich nutze ein struct.
* die Farbe darf sich ändern - am besten über eine andere Variable (d.h. der Wert dieser betreffenden Variable soll genutzt werden)
Code:
properties
col=[00.70.27];
linespec1={'-', 'Color',obj.col}; %geht nicht:
linespec1={'-', 'Color',eval('obj.col')}; %geht nicht
"Undefined variable "obj" or class "obj.col"."
Im Grunde dürfte ein Zeiger auf this.col genau dass sein, was ich da bräuchte...
Zudem geht das aber per se (auch ohne Zeiger) nicht in ein Struct zu pressen:
macht mir ein 1x2 struct
Wobei dass dann auch wieder im Code geht. Ich raff's nicht...
Gelöst habe ich es schlussendlich so, dass ich mir im struct ein "Linienart" mache, dort steht bspw. '-' und mit obj.col baue ich mir das CellArray zusammen. Finde ich nur doof vom OO-Ansatz her.
_________________
Ich hasse es wenn die Leute Fragen stellen, man dann versucht sich Mühe zu geben, und diejenigen ihren Thread nie wieder besuchen...
Nochmal wegen dem dependent:
"the get method for Dependent property 'linespecC' attempts to access the stored property
value. Dependent properties don't store a value and can't be accessed from their get method."
Wenn ich mir eh ne Extrafunktion für mache, kann ich da auch das Cell-Array kreieren... Das wäre dann wahrscheinlich auch hübsch im Sinne der OOP!
Code:
methods function celle=linespec(obj,n)
celle=cell(1,3);
celle{1}=obj.mystruct(n).linespecline;
celle{2}= 'Color';
if(n==1)
celle{3}=obj.col;
end %u.s.w.
end end
Wie gesagt, mir war es dann zu doof und ich es für die Lösung "klassisch" über eine Funktion gemacht, die das linespec-Cellarray für plot() von sich aus / in sich / zur Laufzeit aufbaut.
So einfach sieht das ganze jetzt erstmal aus.
plotcolor wird weiter unten festgelegt (zum Erstellzeitpunkt). Das wird richtig eingefügt.
Soweit so schlecht, denn: celle ist jetzt ein 1x3 struct - das Cellarray hat Matlab nicht im struct gelassen sondern "aufgebrochen" und jedem Element des Cellarrays eine Zeile im Stuct zugewiesen.
d.h. der Ansatz, das Cell in das struct zu packen war (auch) nicht zielführend für mich.
[edit] Wobei es "per se" geht, einem Structeintrag ein Cellarray zuzuordnen.
_________________
Ich hasse es wenn die Leute Fragen stellen, man dann versucht sich Mühe zu geben, und diejenigen ihren Thread nie wieder besuchen...
es ist schwierig, sich da nochmal komplett von vorne reinzudenken.
Kannst du bitte mal nochmal die komplette, momentane Klasse und das gewünschte Verhalten posten?
basestruct=struct('name','Anton','Zelle','a','linespec',0);
basestructarray=[struct('name','Anton','Zelle','a','linespec',0);
struct('name','Bert','Zelle','b','linespec',0); ];
end
properties(Dependent = true)
linespecC
arraylinespecC = [struct('name','Anton','Zelle','a','linespec',0) ;
struct('name','Bert','Zelle','b','linespec',0)];
end
function ret=give_fix(obj) % so sollte es aussehen
ret=struct('name','Anton','Zelle','a','linespec',0);
ret.linespec={'-','Color',obj.color1};
end
function celle=get.linespecC(obj)
%so wird's ein 1x3 struct:
celle=struct('name','Anton','Zelle','a','linespec',{'-','Color',obj.color1});
%so geht's:
celle=obj.basestruct;
celle.linespec={'-','Color',obj.color1};
end
function array=get.arraylinespecC(obj)
array=obj.basestructarray;
array(1).linespec={'-','Color',obj.color1};
array(2).linespec={'-','Color',obj.color2};
end
Das geht jetzt an sich alles wie es soll - Ist nur durch die Definition an zwei verschiedenen Orten eher unschön - bzw. erschließt sich für mich nicht wirklich der effektive Vorteil einer "dependent" gegenüber einer "einfachen" Funktion (wie give_fix).
Wonach ich eigentlich noch suche ist ein Weg, die Zeile
zu umgehen, bzw. mit in der Definition zu schreiben.
_________________
Ich hasse es wenn die Leute Fragen stellen, man dann versucht sich Mühe zu geben, und diejenigen ihren Thread nie wieder besuchen...
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 01.08.2015, 05:00
Titel:
Hi,
dein Wunsch schlägt aufgrund einer kleinen Anomalie in Matlab fehl. Bei der Definition von Cells mit struct() solltest du zweimal geschwungene Klammern setzen. Also wie folgt:
Code:
% Gibt ein 1x3 struct
celle=struct('name','Anton','Zelle','a','linespec',{'-','Color',obj.color1});
% Gibt gewünschtes Ergebnis
celle=struct('name','Anton','Zelle','a','linespec',{{'-','Color',obj.color1}});
da muss ich zugeben, dass ich das Problem die ganze Zeit nicht richtig verstanden habe. Es lag ja letztlich nicht an der Objektorientierten Programmierung, sondern an der Definition der Struktur?
Dadurch, dass ich die Extrafunktion vermeiden wollte, ist mir irgendwie wie ein Nebeneffekt vorgekommen.
Aber zusammenfassend weiss ich jetzt:
dynamischer Variablenaufbau geht nur mittels Funktion
und
um Cell-Arrays im Code genauso zu speichern wie im Script braucht Matlab doppelte geschweifte Klammern.
_________________
Ich hasse es wenn die Leute Fragen stellen, man dann versucht sich Mühe zu geben, und diejenigen ihren Thread nie wieder besuchen...
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.