2015-05-03 51 views
2

我想在Matlab中創建一個代表圖形的類。默認類有2個屬性:一個屬性E,這意味着adjacency matrix和一個依賴屬性adjL,這意味着adjacency list。默認的構造函數類似g = graph(E)g.adjL是根據g.E計算的。Matlab值類 - 無論如何改變構造函數屬性的屬性?

我想問一下是否有無論如何財產adjL所以當我有另一個參數即g = graph(A, 'adjlist'),將創建一個對象現在變成普通財產g.adjL= A和財產E現在變得依賴(計算基於g.adjL)?

回答

1

不是直接。屬性的dependent屬性是靜態的,並且由您在定義類時給出的屬性定義。它不能在每個實例的基礎上進行更改。

但是你仍然可以得到你想要的行爲。你可以做的是使EadjL都依賴,並有兩個其他屬性realErealAdjL保存實際數據。讓EadjL的獲得者看看這兩個字段,並從任何一個字段中導出它們的值。

您甚至不一定需要依賴EadjL來完成此項工作。您可以爲EadjL(如get.Eset.E)定義獲取者和設置者,分別檢查它們的基礎字段並重新填充來自任何字段填充的屬性的可觀察值。

+0

對於遲到的回覆感到抱歉。爲了使「E」和「adjL」都有依賴性,請參閱Mohsen的回答。我也想過編寫getter和setter,它似乎是保持'最新'屬性的唯一方法,儘管兩者現在都存儲在對象中。但是這引出了另一個問題:如果'E'是正常屬性,我應該使用依賴屬性'adjL',還是我應該寫一個'obj.adjL'方法?你有什麼想法? – scmg

0

您可以將EadjL都定義爲依賴項,並且具有一個source屬性,該屬性包含實際值以及描述其源的標誌,然後定義getter方法以決定是應返回實際源還是轉換需要:

classdef graph 
    properties (Access=private) 
     sourcetype 
     source 
    end 

    properties (Dependent) 
     E 
     adjL 
    end 

    methods 
     function obj = graph(varargin) 
      if nargin==1, 
       obj.sourcetype = 'edge'; 
       obj.source = varargin{1}; 
      elseif nargin==2 && strcmp(varargin{2}, 'adjL') 
       obj.sourcetype = 'adjL'; 
       obj.source = varargin{1}; 
      else 
       error('Invalid input arguments'); 
      end 
     end 

     function ret = get.E(obj) 
      if strcmp(obj.sourcetype, 'edge') 
       ret = obj.source; 
      else 
       % convert source from adjL to E 
      end 
     end 

     function ret = get.adjL(obj) 
      if strcmp(obj.sourcetype, 'adjL') 
       ret = obj.source; 
      else 
       % convert source from E to adjL 
      end 
     end 
    end 

end 
+0

這是正確的答案,即時刪除我的。 – Karl

+0

對於遲到回覆感到抱歉。這種方式只適用於在構造函數之後永不改變'E'和'adjL'的值。因此,「依賴關係」的屬性變得毫無用處...... – scmg

+0

您只需要添加'set.E'和'set.adjL'設置方法。例如。 'function obj = set.E(obj,newE); obj.sourcetype ='edge'; obj.source = newE; end'。 –

相關問題