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

Setzen von abstrakten Properties

 

SirHeadless

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.04.2014, 11:12     Titel: Setzen von abstrakten Properties
  Antworten mit Zitat      
Hey,

habe folgendes Problem:

Ich habe 2 Klassen (Klasse A und Klasse B). In der Klasse A habe ich ein Propertie (FunsCell) welches eine Cell ist in dem Verschiedene Objekte der Klasse B enthalten sind. Die Klasse B hat auch eine Funktion um eines ihrer Properties (P1) festzusetzen (set_P1). Nun möchte ich in meiner Klasse A eine Funktion schreiben, welche das "Property" FunsCell so verändert, dass für jede "Zelle" das "P1" in dem Objekt (B) verändert wird.

Meine Umsetzung hat ungefähr diese Form im Moment

Code:
classdef General_Test_Problem

properties
FunsCell ={[1x1 rand_poly]  [1x1 rand_poly] }
end

methods

function TP = General_Test_Problem(...)
...
end

function TP = set_all_P1(TP,x)
     for i = 1:egal
         TP.FunsCell{i} = TP.FunsCell{i}.set_P1(x)
      end
end

...
end
 

Code:

classdef rand_poly

properties
    P1
end

methods
   function RF = rand_poly(...)
       ...
   end

   function RF = set_P1(RF,x)
            RF.P1 = x;
   end

...
end
 

Ich hoffe ich konnte mein Problem verständlich machen und ich würde mich über hilfe sehr freuen.

Grüße

Christoph


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 29.04.2014, 14:41     Titel:
  Antworten mit Zitat      
Hallo

Deine Frage ist immer noch unklar, was möchtest du den mit den Properties machen?

was stimmt denn mit bisherigen Umsetzung nicht, gibt es hier irgendwelche Fehler? Bitte dann Fehler posten oder erläutern, was du hier anders haben möchtest?


Ich glaube du möchtest die Properties auf einmal verändern. Ist das die Frage?
Private Nachricht senden Benutzer-Profile anzeigen
 
SirHeadless

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.04.2014, 07:48     Titel:
  Antworten mit Zitat      
Hey,

ich freue mich, dass jemand versucht mir zu helfen. Ich hatte schon befürchtet, dass es mir nicht gelingt mein Problem hinreichend genau zu erläutern. Ich versuche es noch einmal mit Hilfe meines Codes.

Kurz gesagt geht es bei meiner Programmierung darum eine zufällige Funktion zu erstellen die von R^n nach R abbildet und welche dann später minimiert werden soll.

Ich habe hierzu nun eine Klasse rand_poly erstellt, welche zufällige Polynome erzeugt. Ein für mein Problem wichtiger Ausschnitt der Klasse ist der folgende

Code:

classdef rand_poly
    % Die Klasse erstellt eine zufaelliges Polynom. Dazu wird ein Zufälliger
    % Vektor mit Gewichten und eine Zufällige Matriz mit Potenzen erstellt.
    % Der Vektor mit Gewichten is Element R^k wobei k eine in der Klasse
    % festgelegter Wert ist. Die Funktion lautet nun
    % f(x) = Summe_i^k ( c_i Produkt_j^n (x_j^(aji) ))
    % Ebenfalls wird die erte und zweite Ableitung der Funktion berechnet.

   
      properties(GetAccess = 'public', SetAccess = 'public')
        weights_c
        weights_A
        xdimension
        k = 5
        vekx = []
        x = []
    end
    methods
       
        function RF = rand_poly(n)
            % Initialisiert die Funktion und setzt mit dem Aufruf von zwei
            % Funktionen die zufaellige Polynomdimension und die Gewichte
            %   fest.
            RF.xdimension = n;
            [RF.weights_c,RF.weights_A]  = RF.creat_rand_weights();
            % Kann verwendet werden um k zufaellig zu waehlen
            % RF.k = RF.creat_rand_numbweights(10);
        end

        function RF = set_xandvekx(RF,x)
            RF.x = x;
            RF.vekx = RF.calc_vekx(x);
        end      

        ...
end

 


Meine zweite Klasse heißt General_Test_Problem und hat ein Propertie funcs welches eine Cell sein soll. Diese wird bei der Erstellung eines Objekts der Klasse General_Test_Problem mit Objekten der Klasse rand_poly gefüllt. Dabei sind die Properties x und vekx der rand_poly Objekte noch leer. Nun möchte ich eine Funktion in meiner General_Test_Problem Klasse haben, die diese Properties der rand_poly Objekte füllt. Ich habe dies bis jetzt in der Funktion set_xandvekx versucht umzusetzten

Code:

classdef General_Test_Problem
   
    properties
        matP
        matH
        vekc
        numL
        xdim
        gdim
        act_gdim
        hdim
        funcs
        func0
        use_funcs = {@rand_poly}
        b = [5,10,7,4,8]
        solx
        solv
        solua
        soluna
        solu
        matd
        vekmu
        fv_in_solx
    end
   
    methods
        function TP = General_Test_Problem(n,m,ma,l,solx)
           
            TP.xdim = n;
            TP.gdim = m;
            TP.act_gdim = ma;
            TP.hdim = l;
            TP.matd = TP.creat_rand_matd();
            [TP.funcs,TP.func0] = TP.creat_rand_funcs();
            %TP.set_x_for_all(solx);
            TP.solx = solx;
            TP.solv = TP.creat_rand_solv();
            TP.solua = TP.creat_rand_solua();
            TP.soluna = zeros(TP.gdim-TP.act_gdim,1);
            TP.solu = [TP.soluna;TP.solua;TP.solv];
            TP.matP = TP.creat_matP();
            TP.matH = TP.creat_matH();
            TP.vekc = TP.creat_vekc();
            TP.numL = TP.creat_numL();
            TP.vekmu = TP.creat_rand_vekmu();
            TP.fv_in_solx = TP.calc_fv_in_solx();
           
        end
       
        function TP = set_x_for_all(TP,x)
            nw_funcs = cell(1,TP.gdim+TP.hdim);
            for i = 1:TP.gdim+TP.hdim
                nw_funcs{i} = TP.funcs{i}.set_xandvekx(x);
            end            
            TP.funcs = nw_funcs
        end
 


Wenn ich nun ein General_Test_Problem Objekt erstelle und die funktion set_x_for_all aufrufe und danach mir die rand_poly Objekte in funcs anschaue, dann sind die vekx und x immer noch leer ([]).

Lasse ich mir aber die einzelnen nw_funcs in set_x_for_all ausgeben sehe ich, dass er rand_poly Objekte erstellt in denen x und vekx definiert ist. Leider Speichert er diese nicht wie gewünscht in die funcs Cell.

Ich denke man kann dieses Problem auch einfacher Erklären aber leider gelingt mir das nicht. Ich hoffe jedoch, dass mein Problem dieses mal verständlicher ist.

Grüße

Christoph
 
Titus
Forum-Meister

Forum-Meister


Beiträge: 871
Anmeldedatum: 19.07.07
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 25.06.2014, 13:14     Titel:
  Antworten mit Zitat      
Hallo Christoph,

ich denke, Du übersiehst das Value-Verhalten Deiner Klasse: wenn Du nur
Code:
TP.set_x_for_all(solx);

schreibst, wird zwar alles gesetzt, Du musst die Variable aber wieder zuweisen, d.h.
Code:
TP = TP.set_x_for_all(solx);
% oder äquivalent
TP = set_x_for_all(TP, solx);

Alternativ kannst Du auch eine handle-Klasse schreiben (dann wird die erste Zeile so aussehen:
Code:
classdef General_Test_Problem < handle

dann brauchst Du das Ergebnis nicht mehr zuweisen (schau in der Hilfe unter Value/Handle semantics nach).

Ciao,
Titus
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.