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

Set property von Objekten eines Sets

 

joekey
Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 07.09.2014, 02:05     Titel: Set property von Objekten eines Sets
  Antworten mit Zitat      
Hallo,

ich versuche mit cellfun property von mehreren objekten (eine Klasse) neu zu setzen:

Item Klasse
Code:

classdef cItem < handle
   
    properties
        prop
    end
   
    methods
        %constructor
        function obj = cItem()
           
            obj.prop = 0;
        end
    end
end
 


Set Klasse
Code:

classdef cSet < handle
   
    properties
        elements
    end
   
    methods
        %constructor
        function obj = cSet()
           
            obj.elements{1,1} = cItem();
            obj.elements{2,1} = cItem();
            obj.elements{3,1} = cItem();
            obj.elements{4,1} = cItem();
            obj.elements{5,1} = cItem();
        end
    end
end
 


Test Script
Code:

%(1)set erstellen
s = cSet()

%(2)prop ausschreiben
cellfun(@(elem) elem.prop, s.elements,'UniformOutput', false)

%(3)prop setzen 1. Versuch
cellfun(@(elem) elem.prop = 1, s.elements,'UniformOutput', false)

%(4)prop setzen 2. Versuch
cellfun(@(elem) elem.prop = num2cell(ones(5,1)), s.elements,'UniformOutput', false)
 


Die Punkte (3) und (4) melden ein Fehler. Wie kann ich also die Prop von der Objekten ändern? Vor allem ohne dass ich eine FOR-Schleife verwenden muss?

Danke!

joekey
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: 07.09.2014, 12:06     Titel:
  Antworten mit Zitat      
Hallo,

die kurzfristige Antwort:

Füge weitere Methoden hinzu.

Code:
classdef cItem < handle
   
    properties
        prop
    end
   
    methods
        %constructor
        function obj = cItem()
           
            obj.prop = 0;
        end
       
        function changeit(obj, N)
            obj.prop = N;
        end
    end
end


Code:
classdef cSet < handle
   
    properties
        elements
    end
   
    methods
        %constructor
        function obj = cSet()
           
            obj.elements{1,1} = cItem();
            obj.elements{2,1} = cItem();
            obj.elements{3,1} = cItem();
            obj.elements{4,1} = cItem();
            obj.elements{5,1} = cItem();
        end
       
        function changeElements(obj, N)
            cellfun(@(ele) changeit(ele, N), obj.elements)
        end
           
    end        
       
end


Dann geht's:
Code:
%(1)set erstellen
s = cSet()

%(2)prop ausschreiben
cellfun(@(elem) elem.prop, s.elements,'UniformOutput', false)

changeElements(s, 1)
cellfun(@(elem) elem.prop, s.elements,'UniformOutput', false)


Langfristig sollte man sich aber überlegen, ob das Klassendesign in dieser Form so geschickt ist.

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

Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 07.09.2014, 12:43     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für deine Antwort.

Deine Lösung funktioniert prima. Es hätte mich aber auch interessiert was du genau mit der Klassendesing meinst? In welchem Hinsicht hast du Bedenken?

Danke!

LG
Joekey
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: 07.09.2014, 20:22     Titel:
  Antworten mit Zitat      
Hallo,

du sagtest ja, dass du keine for-Schleifen verwenden willst. Daraus schließe ich, dass dir Performance wichtig ist. Nun ist es bei meinem Vorschlag so, dass auch ohne Schleife für jedes Item die Methode separat aufgerufen werden muss.

Insbesondere falls du mal nicht 5, sondern 50000 Items hast, kann das ineffizient werden. Dann bevorzugt man häufig ein Objekt, das Arrays beinhaltet, gegenüber einem Array von Objekten. Hier wäre elements also ein cItem, dessen prop-Eigenschaft ein Vektor von 5 Werten ist.

Solange es sich im Rahmen hält, ist mir persönlich gute Lesbarkeit und Struktur von Programmen wichtiger als die Ausführgeschwindigkeit. Ich hätte hier also bedenkenlos eine for-Schleife verwendet - außer eben ich bekomme ernsthafte Performance-Probleme.
Vor allem aber würde ich immer darauf achten, die Daten so zu organisieren, dass "typische" Zugriffsarten (welche das sind, ist fallspezifisch) bequem sind - siehe oben Objekt von Arrays vs. Array von Objekten.

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

Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 07.09.2014, 23:49     Titel:
  Antworten mit Zitat      
Hello Harald,


Zitat:
du sagtest ja, dass du keine for-Schleifen verwenden willst. Daraus schließe ich, dass dir Performance wichtig ist.


richtig, es ging mir um die Performance

Zitat:
Insbesondere falls du mal nicht 5, sondern 50000 Items hast, kann das ineffizient werden.


momentan beinhaltet mein Set 1500 Items. Momentan gehe ich davon aus, dass es in der Zukunft max 3000 sein werden. Sonst stimme ich dir zu, dass die Lesbarkeit wichtiger ist, so lange die Performance einigermassen in Ordnung ist.

Danke für deine Meinung!

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