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
如果对 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
我没有运行任何这些功能,因为您没有提供任何示例数据/代码。请测试和反馈。
我已经被这个问题困扰了一段时间,但我找不到之前问过的类似问题(或者我没有找到)
我的情况相当简单:我有一个对象元胞数组。它们都是同一个对象,我有一个针对此类对象的 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
如果对 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
我没有运行任何这些功能,因为您没有提供任何示例数据/代码。请测试和反馈。