MATLAB:在 cellfun 中使用 get 获取对象元胞数组

MATLAB: Using get in cellfun for a cell array of objects

我已经被这个问题困扰了一段时间,但我找不到之前问过的类似问题(或者我没有找到)

我的情况相当简单:我有一个对象元胞数组。它们都是同一个对象,我有一个针对此类对象的 get 函数:get (obj, attr),其中 obj 是所讨论的对象,attr 是 1-6 之间的整数。根据编号获取函数returns对应的属性。

我想从相应元胞数组中的所有对象获取我的所有 "position" 属性(这将是 attr = 2)。我知道 cellfun 在所有单元格上执行一个函数,但问题是,考虑到该函数是 get (obj, attr) ,我如何在这里对我的所有对象使用我的 get 函数?

提前致谢

首先,通过使用 get 作为自定义函数,您正在隐藏内置 get function - 这是不好的做法!

考虑到这一点,并避免与具有类似语法的内置 get 函数混淆,我将使用 getattr 作为自定义函数的替代它接受一个对象和一个 1 到 6 的整数。

pos = cellfun( @(obj) getattr( obj, 2 ), myCellOfObjects, 'uni', 0 );

通过指定 'uni', 0,输出不必是标量,将被放入元胞数组中。例如,当您的位置有一个多元素数组时,这很有用。

这相当于下面的循环:

pos = cell( numel(myCellOfObjects), 1 );
for ii = 1:numel(pos)
    pos{ii} = getattr( myCellOfObjects{ii}, 2 );
end

如果对 cellfunarrayfun 有疑问,只需先写一个循环 - 它们本质上相同但更简洁。

其中有一个技巧,有些人并不知道:您可以像这样将多个参数传递给 cellfun:

cellfun(@(obj,attr) get(obj,attr), {obj1,obj2},{attr1,attr2},'uni',0)

如果你想获得 cellarray 的一个属性(而不是为 cellarray 中的每个对象提供一个属性),那么你可以简单地使用这个

cellfun(@(x) getattr(x,attr),obj,'uni',0)

为方便起见放入匿名函数:

get_attr = @(obj,attr) cellfun(@(x) getattr(x,attr),obj,'uni',0)
%use:
get_attr(obj_in_cellarray,'myattribute') 
%returns cell array of object attributes

我没有运行任何这些功能,因为您没有提供任何示例数据/代码。请测试和反馈。