2012-10-27 107 views
0

對於此示例對象:從陣列卸下MATLAB對象,刪除空數組的空間

classdef TestObject < handle 
    %UNTITLED Summary of this class goes here 
    % Detailed explanation goes here 

    properties 
     a; 
    end 

    methods 
    end 

end 

和本實施例中的腳本:

tbarray = TestObject.empty(); 

for i=1:3 
    newTestObject=TestObject; 
    newTestObject.a=i; 
    if(i==1) 
     firstTestObject=newTestObject; 
    end 
    tbarray(end+1,1)=newTestObject; 
end 
delete (firstTestObject) ; 

這個運行之後tbarray第一位置具有一個空的TestObject。是否可以調整tbarray的大小,刪除空的對象或使用某種刪除呼叫,例如

index=tbarray.remove(firstObject); 
tbarray.add(index,laterTestObject); 

tbarray.Replace(firstObject,laterObject);

更新: 我怎麼會找到我想要刪除的對象的數組索引/替換。該示例使用1,但每次可能會有所不同。

回答

1

tbarray(1) = []將刪除索引1並調整數組的大小(所以它現在有1個更少的長度)。 tbarray(1) = laterObject將索引1

代替沒有設定或在Matlab任何類的按鍵(不只是基元/串)地圖,所以像tbarray.Replace(firstObject,laterObject);是接近不可能不知道該指數實現。


編輯
如果你想找到數組中的某些元素出現的指數,你可以使用find(tbarray == firstObject)
請注意tbarray == firstObject返回一個可以直接用作索引的邏輯數組,例如, tbarray(tbarray == firstObject) = []tbarray(tbarray == firstObject) = laterObject

但是,您應該記住,這些操作是昂貴的,因爲整個數組都是遍歷的。如果您可以定義一些類型爲double,single,數組爲char的唯一密鑰或者對象爲有符號或無符號的32位或64位整數,則可以將它們存儲在containers.Map中。

在這個例子中你使用了句柄類。如果你需要一個值類,你還需要定義一個矢量化的eq()方法。

+0

謝謝!!!這適用於這個代碼示例,我知道objectToRemove的索引。但在我的情況下,我如何搜索列表中的對象,獲取其索引,然後在該索引處移除/替換。 –