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

ein Property, welches auf ein anderes verweist

 

Andy386
Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 07.03.2015, 10:58     Titel: ein Property, welches auf ein anderes verweist
  Antworten mit Zitat      
Hallo,

Für div. graphische Ausgaben habe ich einen Weg gefunden, der mir gefällt: dabei nutze ich cell arrays.

Nun hätte ich gerne so ein cell nicht erst im Code erzeugt sondern als Property zum Object abgelegt.

Ich hätte bspw. gerne
Code:
linespec={'-', 'Color', obj.color};

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...
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: 09.03.2015, 18:37     Titel:
  Antworten mit Zitat      
Hallo,

wie wäre es, LineSpec als Dependent Property zu definieren?
In der get-Methode kannst du dann obj.color verwenden.

Zitat:
btw.: kann man irgendwie ein cell array als EIN Feld in einem struct ablegen?

Code:
structName.VariableName = cellName
wäre wohl zu einfach? Kannst du das genauer erklären?

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

Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 05.06.2015, 15:25     Titel:
  Antworten mit Zitat      
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=[0 0.7 0.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:
Code:
linespec1=struct('name','Anton','Zelle',{'-', 'Color'});

macht mir ein 1x2 struct Sad
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...
Private Nachricht senden Benutzer-Profile anzeigen
 
Andy386
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 05.06.2015, 15:37     Titel:
  Antworten mit Zitat      
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."

Code:

    properties (Dependent = true)
        linespecC=struct('name','Anton','Zelle',{'-', 'Color',obj.color});
    end
   
    methods
        function celle=get.linespecC(obj)
            celle=obj.linespecC;
        end
    end


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! Razz

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


so, oder geht das besser?




Aso, Angewendet wird dann so:
Code:
tempcell=myobjekt.linespec(1);
plot(x,y,tempcell{:});


-- ich glaub, ich schreib mir einfach ne eigene kleine plot-funktion...
_________________

Ich hasse es wenn die Leute Fragen stellen, man dann versucht sich Mühe zu geben, und diejenigen ihren Thread nie wieder besuchen...
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: 05.06.2015, 18:57     Titel:
  Antworten mit Zitat      
Hallo,

das ist nun etwas unübersichtlich geworden. Was ich mir vorgestellt habe, wäre wenn eher:

Code:
properties (Dependent = true)
        linespecC
    end
   
    methods
        function celle=get.linespecC(obj)
            celle=struct('name','Anton','Zelle',{'-', 'Color',obj.color});
        end
    end


Dann sollte bei Abfrage von linespecC die aktuelle Farbe übernommen werden.

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

Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 23.07.2015, 15:40     Titel:
  Antworten mit Zitat      
Das zieht sich ganz schön bei mir...

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.

Nun zum Ansatz mit Dependent.
Code:
   
    properties (Dependent = true)
         linespecC
         structlinespecC
     end      
   
    methods   %testing. Bitte einsortieren wenn fertig.    

         function celle=get.linespecC(obj)
                celle=struct('name','Anton','Zelle','a','linespec',{'-', 'Color',obj.plotcolor});
         end


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.


Arrow 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. Rolling Eyes
_________________

Ich hasse es wenn die Leute Fragen stellen, man dann versucht sich Mühe zu geben, und diejenigen ihren Thread nie wieder besuchen...
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: 24.07.2015, 21:27     Titel:
  Antworten mit Zitat      
Hallo,

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?

Danke und Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Andy386
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 28.07.2015, 14:01     Titel:
  Antworten mit Zitat      
So, hier nochmal sauber als Extraproblemklasse:

Code:
classdef Klasse
   
    properties
        color1=[0.5 1 0];
        color2=[1 0 0.5];
       
        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
   
   
    methods
       
        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  
       
     
    end    
end %von Klasse


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
Code:

            XXX.linespec={'-','Color',obj.color1};

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...
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.08.2015, 06:00     Titel:
  Antworten mit Zitat      
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}});
 


Viele Grüße
 
Andy386
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 04.08.2015, 09:47     Titel:
  Antworten mit Zitat      
Wow, vielen Dank!

Hast du das selber rausbekommen?
_________________

Ich hasse es wenn die Leute Fragen stellen, man dann versucht sich Mühe zu geben, und diejenigen ihren Thread nie wieder besuchen...
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: 04.08.2015, 16:38     Titel:
  Antworten mit Zitat      
Hallo,

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?

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

Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 18.08.2015, 08:37     Titel:
  Antworten mit Zitat      
Ja, das war wohl mein Hauptproblem Embarassed

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