2014-10-31 3 views
2

Для вызовов функции (MEX) было бы очень приятно передать сразу несколько свойств одного объекта. Вместо foo(myObj.propA, myObj.propB) Я хочу что-то вроде foo(myObj.[propA,propB].Вызов функции с несколькими свойствами объекта

Возможно ли это?

С структур можно использовать функцию getfield(), чтобы получить данные из более чем одной области, например:

getfield(myStruct, {index}, {'fieldA', 'fieldB'}) 

Но, к сожалению, следующая попытка получить больше, чем одно свойство из объекта приводит в погрешности (индекс превышает размеры матрицы):

getfield(myObj, {index}, {'propA', 'propB'}) 

Может быть, единственная возможность состоит в том, чтобы написать функцию, которая возвращает несколько выходных аргументов:

[varargout] = getProps(object,propnames) 

for p=1:numel(propnames) 
    varargout{p} = object.(propnames{p}); 
end 

Но если я вызываю другую функцию с этой функцией в качестве входа, например. sum(getProps(myObj,propnames)) передается только первый выходной аргумент getProps, и я впадаю в отчаяние. Есть ли другой путь?

ответ

1

Для объекта, вы должны использовать get, а не getfield (или динамический доступ в цикле, как показано на рисунке).

>> h = figure; 
>> get(h,{'Position','Renderer'}) 
ans = 
    [1x4 double] 'opengl' 

Это не работает для всех объектов, но для графических объектов MATLAB это действительно работает. Для того, чтобы иметь дело с любым классом, вы можете использовать функцию, но с выходом пользовательских ячейки вместо varargout:

function C = getProps(object,propnames) 

for p = 1:numel(propnames), 
    C{p} = object.(propnames{p}); 
end 

Тогда внутри любой функции вы пишете, вы можете получить через запятую список всех свойств с C{:}, который будет подходящим для функции, которая ожидает, что каждое имя свойства будет введено как отдельный аргумент (например, C = getProps(myObj,propnames); x = myFun(h,C{:}).

+0

Возможно, мой Matlab R2011b слишком старый, но входы не передаются отдельно функции. Например, с объектом с значения свойств 'A = 1' и' B = 3': 'C = getProps (obj, {'A' 'B'})' дает 'C = [1] [3]' и 'C {:}' возвращает список, разделенный запятой ' ans = 1; ans = 3', но sum (C {:}) возвращает 'ans = 1'. – JaBe

+0

@JaBe Затем выполнение 'myfun (C {:})' даст 'myfun' два входа. Когда вы выполняете 'sum (C {:})', это эквивалентно 'sum (1,3)', который вычисляет сумму по ** третьему размеру **, а не сумму двух чисел. Вам понадобится конкатенация для получения массива signles: '[C {:}]'. – chappjc

+0

@JaBe Если это дало вам информацию, необходимую для этого вопроса, пожалуйста, примите. Благодаря! :) – chappjc

Смежные вопросы