0

对于此示例对象:

    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,但每次可能不同。

4

1 回答 1

1

tbarray(1) = []将删除索引 1 并调整数组的大小(因此它现在的长度减少了 1)。 tbarray(1) = laterObject将在索引 1 处替换。

在 Matlab 中没有任何类的键(而不仅仅是原语/字符串)的 Set 或 Map,所以tbarray.Replace(firstObject,laterObject);在不知道索引的情况下几乎不可能实现类似的事情。


编辑
如果要查找数组中某些元素出现的索引,可以使用find(tbarray == firstObject).
请注意,它tbarray == firstObject返回一个可以直接用作索引的逻辑数组,例如tbarray(tbarray == firstObject) = []or tbarray(tbarray == firstObject) = laterObject

但是,您应该记住,这些操作很昂贵,因为要遍历整个数组。如果您可以为您的对象定义一些类型为doublesingle、数组char或有符号或无符号 32 位或 64 位整数的唯一键,则可以将它们存储在containers.Map.

在此示例中,您使用句柄类。如果您需要一个值类,您还需要在其上定义一个向量化的 eq() 方法。

于 2012-10-27T14:32:10.127 回答