我已经被这个问题困扰了一段时间,我以前找不到类似的问题(或者我没有找到(
我的情况相当简单:我有一个对象的单元格数组。它们都是同一个对象,我对这类对象有一个get函数,它是:get(obj,attr(,其中obj是所讨论的对象,attr是1-6的整数。根据数字的不同,get函数会返回相应的属性。
我想从对应单元格数组中的所有对象中获得我的所有"位置"属性(这将是attr=2(。我知道cellfun在所有单元格上执行一个函数,但问题是,考虑到函数是get(obj,attr(,我如何在这里为所有对象使用get函数?
提前感谢
首先,通过使用get
作为自定义函数,您正在隐藏内置的get
函数-这是一种糟糕的做法!
考虑到这一点,为了避免与具有类似语法的内置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
如果对cellfun
或arrayfun
有疑问,只需先写一个循环——它们本质上是一样的,但更简洁。
有一个技巧有些人不知道:你可以像这样向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
由于您没有提供任何示例数据/代码,因此我没有运行任何这些函数。请测试并反馈。