2010-05-15 37 views
1

以前,我實現了存取器如下,但是它跑壯觀慢慢遞歸算法OO我的工作,我懷疑這可能是因爲我對每一個函數調用複製對象......這是正確的?如何在Matlab中創建高效的實例變量mutators?

%% Example Only 
obj2 = tripleAllPoints(obj1) 
    obj.pts = obj.pts * 3; 
    obj2 = obj1 
end 

然後,我嘗試不使用輸出對象實現存取器......然而,似乎在MATLAB我不能做到這一點 - 這些變化將不是「大棒」,因爲範圍的問題嗎?

%% Example Only 
tripleAllPoints(obj1) 
    obj1.pts = obj1.pts * 3; 
end 

對於應用目的,我的代碼極其簡化版本(其使用OO和遞歸)低於。

classdef myslice 

properties 
    pts  % array of pts 
    nROW % number of rows 
    nDIM % number of dimensions 
    subs % sub-slices 
end % end properties 

methods 
    function calcSubs(obj) 
     obj.subs = cell(1,obj.nROW); 
     for i=1:obj.nROW 
      obj.subs{i} = myslice; 
      obj.subs{i}.pts = obj.pts(1:i,2:end); 
     end 
    end 

    function vol = calcVol(obj) 
     if obj.nROW == 1 
     obj.volume = prod(obj.pts); 
     else 
     obj.volume = 0; 
     calcSubs(obj); 
     for i=1:obj.nROW 
       obj.volume = obj.volume + calcVol(obj.subs{i}); 
     end 
     end 
    end 

end % end methods 

end % end classdef 

回答

3

Matlab有兩種類型:handle and value

值類是按值傳遞,並有這樣每當你寫它被複制。另外,方法調用的格式必須是obj = method(obj);,以便更改爲「stick」。

相反,處理對象是通過引用傳遞,因此,無論何時修改一個對象在任何工作空間 - 基工作區或一個函數的工作空間 - 對象被到處改變。因此,呼叫method(obj);在調用工作區更改obj爲好,即使obj沒有明確地返回。

缺省類爲值對象。如果你想使用手柄對象,你classdef線必須是:

classdef myslice < handle 

即您繼承手柄類。

1

在這種情況下,你可以給MATLAB關於什麼是使用相同的名稱作爲輸入你的輸出去執行一個額外的提示。在你的例子中,這避免了創建obj的副本。這可能並不總是適當的(例如,如果您需要obj.pts的舊值和新值來更新其他某個屬性)。

%% Example Only 
obj = tripleAllPoints(obj) 
    obj.pts = obj.pts * 3; 
end 

(參見:http://blogs.mathworks.com/loren/2007/03/22/in-place-operations-on-data/

相關問題