MATLAB:使用get in cellfun创建对象的单元阵列



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

我的情况相当简单:我有一个对象的单元格数组。它们都是同一个对象,我对这类对象有一个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

如果对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

由于您没有提供任何示例数据/代码,因此我没有运行任何这些函数。请测试并反馈。

相关内容

  • 没有找到相关文章

最新更新