2016-04-09 10 views
0

I auf einem Simulink-Modell bin arbeiten, die auf verschiedenenModi konfiguriert ist, dass die Modellparameter zu ändern, basierend auf dem Material wie die gewählten Abtastrate Filtergruppenverzögerung, etc ...Converting Klasseneigenschaften auf struct Sichtbarkeit bezüglich

I obwohl alle Parameter auf eine ParameterStruct setzen, laden Sie dann die richtige Parameter-Struktur für jeden Modus.

Diese Art der Zuordnung zu einer Klasse mit abhängigen Eigenschaften ist gut, da es viele Modellparameter gibt, die nur aus ein paar Eingaben generiert werden.

Aber wenn ich versuche, ein struct aus der einer class Sichtbarkeit zu erzeugen, nicht eingehalten wird:

classdef SquareArea 
    properties 
     Width 
     Height 
    end 
    properties (Access =private) 
     Hidden 
    end 
    properties (Dependent) 
     Area 
    end 
    methods 
     function a = get.Area(obj) 
     a = obj.Width * obj.Height; 
     end 
    end 
end 
>> x=SquareArea 

x = 

    SquareArea with properties: 

    Width: [] 
    Height: [] 
     Area: [] 

>> struct(x) 
Warning: Calling STRUCT on an object prevents the object 
from hiding its implementation details and should thus 
be avoided. Use DISP or DISPLAY to see the visible public 
details of an object. See 'help struct' for more information. 

ans = 

    Width: [] 
    Height: [] 
    Hidden: [] 
     Area: [] 

Dies ist nicht akzeptabel, weil ich die Struktur zu C danach exportieren muß , um den Modus dynamisch aus dem generierten Code zu setzen.

Antwort

1

Sie können die Standard-struct für Ihre Klasse außer Kraft setzen:

classdef SquareArea 
    properties 
     Width = 0 
     Height = 0 
    end 
    properties (Access=private) 
     Hidden 
    end 
    properties (Dependent) 
     Area 
    end 
    methods 
     function a = get.Area(obj) 
     a = obj.Width * obj.Height; 
     end 
     function s = struct(obj) 
      s = struct('Width',obj.Width, 'Height',obj.Height, 'Area',obj.Area); 
     end 
    end 
end 

Jetzt:

>> obj = SquareArea 
obj = 
    SquareArea with properties: 

    Width: 0 
    Height: 0 
     Area: 0 
>> struct(obj) 
ans = 
    Width: 0 
    Height: 0 
     Area: 0 

Beachten Sie, dass Sie immer noch das ursprüngliche Verhalten explizit bekommen kann durch die eingebaute ein Aufruf:

>> builtin('struct', obj) 
Warning: Calling STRUCT on an object prevents the object from hiding its implementation details and should 
thus be avoided. Use DISP or DISPLAY to see the visible public details of an object. See 'help struct' for 
more information. 
ans = 
    Width: 0 
    Height: 0 
    Hidden: [] 
     Area: 0 
1
publicProperties = properties(x); 
myStruct = struct(); 
for iField = 1:numel(publicProperties), myStruct.(publicProperties{iField}) = []; end 
0

Kombiniert die Antworten von Amro & DVarga, eine Standard-Struktur-Funktion kann verallgemeinert werden:

 function s = struct(self) 
     publicProperties = properties(self); 
     s = struct(); 
     for fi = 1:numel(publicProperties) 
      s.(publicProperties{fi}) = self.(publicProperties{fi}); 
     end     
    end