MATLAB: использование get in cellfun для массива объектов. - PullRequest
0 голосов
/ 27 марта 2020

Я застрял с этим некоторое время, и я не мог найти что-то подобное, заданное ранее (или мне не удалось это сделать)

Моя ситуация довольно проста: у меня есть массив ячеек объекты. Все они являются одним и тем же объектом, и у меня есть функция get для такого типа объектов: get (obj, attr), где obj - рассматриваемый объект, а attr - целое число от 1 до 6. В зависимости от числа функция get возвращает соответствующий атрибут.

Я хотел бы получить все свои атрибуты "position" из всех моих объектов, которые находятся в соответствующем массиве ячеек (это будет attr = 2). Я знаю, что cellfun выполняет функцию для всех ячеек, но вопрос в том, как использовать здесь функцию get для всех моих объектов, учитывая, что функция get (obj, attr)?

Спасибо заранее

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

В этом есть хитрость, о которой некоторые даже не подозревают: вы можете передать несколько аргументов в cellfun следующим образом:

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

, если вы хотите получить один атрибут 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

Я не запускал ни одну из этих функций, так как вы не не приведу ни одного примера данных / кода. Пожалуйста, проверьте и обратная связь.

0 голосов
/ 27 марта 2020

Во-первых, используя get в качестве пользовательской функции, вы скрываете встроенную функцию get - это плохая практика!

Имея это в виду, и Во избежание путаницы со встроенной функцией get, которая имеет аналогичный синтаксис, я собираюсь использовать getattr в качестве замены для вашей пользовательской функции, которая принимает объект и целое число от 1 до 6.

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

Указав 'uni', 0, выходные данные не должны быть скалярными и будут помещены в массив ячеек. Это полезно, когда, например, у вас есть многоэлементный массив для вашей позиции.

Это эквивалентно следующему l oop:

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

Если вы сомневаетесь в cellfun или arrayfun, просто сначала напишите al oop - они по сути то же самое, но более кратко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...