2011-05-25 215 views
5

我與OOP玩弄MATLAB中的數組,我有下面的構造:MATLAB初始化對象

 
function obj = Squadron(num_fighters, num_targets, time_steps)    
    if nargin == 0 
     num_targets = 100; 
     time_steps = 100; 
     num_fighters = 10; 
    end 
    obj.num_shooters = num_fighters; 
    for iShooter = 1:obj.num_shooters 
     a(iShooter) = Shooter(num_targets, time_steps); 
    end 
    obj.ShooterArray = a; 
    obj.current_detections = zeros(num_fighters, num_targets); 
end 

該臨時變量「a」氣味太可怕了。有沒有更好的方法來初始化一個對象數組,我希望有一個push/pop方法。我相信有更好的方法來做到這一點。

+0

令人驚訝的,你也可以直接在'Shooter'構造分配'Shooter'陣列:http://www.mathworks.com /help/techdoc/matlab_oop/brd4btr.html – Mikhail 2011-05-26 05:10:15

+0

我分配它的構造函數,你知道一個更清潔的方式來做到這一點比使用臨時變量嗎?也許我錯過了一些東西。 – bonhoffer 2011-05-26 11:01:51

+0

「更清潔的方式」是主觀的...我的信息:它的作品不僅在'Squadron'也可直接在'Shooter'構造。 – Mikhail 2011-05-26 15:00:22

回答

10

看起來你正在試圖創建手柄對象(射擊)的陣列,並將其存儲另一個手柄對象(Squardron)的屬性裏面。我有一個非常有幫助的similar problem discussion

總之:你在做什麼可能不是很美 - 但可能已經相當不錯了。

在Matlab中創建一個數組時,通常需要做一些預分配來預留內存,這大大加快了性能。

在正常情況下是這樣的:

a=zeros(1,1000); 
for n=1:1000 
    a(n)=n; 
end 

(此處爲= 1:1000;甚至會更好)

對於對象的預分配作品通過分配的對象中的一個來數組中最後一個字段。然後,Matlab通過調用沒有參數的對象的構造函數創建的對象(句柄)來填充其他字段(請參閱Matlab help)。因此,一個預分配的對象可能看起來像這樣:

a(1,1000)=ObjectConstructor(); 
for n=1:1000 
    a(n)=ObjectConstructor(); 
end 

或者乾脆

for n=1000:-1:1 
    a(n)=ObjectConstructor(); 
end 

確保射手可以不帶參數調用,你應該能夠做一些事情,如:

for iShooter = obj.num_shooters:-1:1 
    obj.ShooterArray(iShooter) = Shooter(num_targets, time_steps); 
end 

然而,事實證明,由於某種原因對象在另一個對象的屬性數組這直接入庫創造表現很糟糕。 (在這種情況下,陣列預分配可能不起作用)。因此,在這種情況下,使用輔助變量並將整個數組一次分配給屬性是提高性能的一個好主意。

我會嘗試:

for iShooter = obj.num_shooters:-1:1 
    a(iShooter) = Shooter(num_targets, time_steps); 
end 
obj.ShooterArray = a; 

再次 - 更多細節見this discussion

4

有一對夫婦的方式來處理這種情況...

  • Building object arrays in the constructor:

    您可以修改您的Shooter類,這樣當你通過值數組它創建對象的數組。然後,你可以初始化ShooterArray像這樣:

    obj.ShooterArray = Shooter(repmat(num_targets,1,num_fighters),... 
              repmat(time_steps,1,num_fighters)); 
    
  • 值類的複製實例:

    如果Shootervalue class,每個對象將是正好相同(即你不要將它的任何默認屬性初始化爲隨機值),那麼您只能創建一個對象並使用它複製:REPMAT

    obj.ShooterArray = repmat(Shooter(num_targets,time_steps),1,num_fighters); 
    

    不幸的是,如果Shooterhandle class的子類,那麼不能像使用值類一樣複製它。當你真的需要多個獨立的對象,每個對象都有自己獨特的引用時,你實際上會複製引用到一個對象。在這種情況下,您當前的代碼可能是最好的解決方案。