我已经坚持了一段时间了,我找不到以前问过的类似的东西(或者我失败了)。
我的情况相当简单:我有一个对象的单元数组。它们都是相同的对象,我对这类对象有一个get函数: get ( obj,attr),其中obj是有问题的对象,attr是1-6的整数。根据数字的不同,get函数返回相应的属性。
我希望从位于相应单元格数组中的所有对象中获取所有"position“属性(这将是attr = 2)。我知道cellfun在所有单元格上执行一个函数,但问题是,考虑到该函数是get (obj,attr),我如何在这里对所有对象使用get函数?
提前感谢
发布于 2020-03-27 17:23:53
首先,通过使用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如果对cellfun或arrayfun有疑问,只需先编写一个循环--它们本质上是相同的,但更简洁。
发布于 2020-03-27 23:16:18
这其中有一个技巧,有些人并不知道:你可以像这样传递多个参数给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我没有运行这些函数中的任何一个,因为您没有提供任何示例数据/代码。请测试并反馈。
https://stackoverflow.com/questions/60878133
复制相似问题