JaBe
JaBe

Reputation: 684

Call a function with several properties of an object

For (MEX) function calls it would be really nice to pass several properties of one object at once. Instead of foo(myObj.propA, myObj.propB) I want something like foo(myObj.[propA,propB].

Is this even possible?

With structs it is possible to use the getfield() function to get the data from more than one field, e.g.:

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

But unfortunately, the following attempt to get more than one property from an object results in an error (Index exceeds matrix dimensions):

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

Maybe the only possibility is to write a function which returns several output arguments:

[varargout] = getProps(object,propnames)

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

But if I call another function with that function as input, e.g. sum(getProps(myObj,propnames)) only the first output argument of getProps is passed and I fall into despair. Is there any other way?

Upvotes: 2

Views: 51

Answers (1)

chappjc
chappjc

Reputation: 30579

For an object, you'd use get, not getfield (or dynamic access in a loop like you showed).

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

This doesn't work for all objects, but for MATLAB graphics objects it does work. To deal with any class, you can use your function, but with a custom cell output instead of varargout:

function C = getProps(object,propnames)

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

Then inside whatever function you write, you can get a comma-separated list of all properties with C{:}, which will be suitable for a function that expects each property name input as a separate argument (e.g. C = getProps(myObj,propnames); x = myFun(h,C{:}).

Upvotes: 1

Related Questions