Search code examples
matlabobjectgetcell-array

MATLAB: Using get in cellfun for a cell array of objects


I've been stuck with this for a while and I couldn't find something similar asked previously (or I have failed in doing so)

My situation is fairly simple: I have a cell array of objects. They are all the same object and I have a get function for this kind of object which is: get (obj, attr), where obj is the object in question and attr is a integer from 1-6. Depending on the number the get function returns the corresponding attribute.

I would like to obtain all of my "position" attributes from all my objects which are in the corresponding cell array (this would be attr = 2). I know that cellfun performs a function on all cells, but the question is, how do I use my get function here for all my objects, taking into account that the function is get (obj, attr) ?

Thanks in advance


Solution

  • Firstly, by using get as a custom function you are shadowing the built-in get function - this is bad practise!

    With this in mind, and to avoid confusion with the built-in get function which has similar syntax, I'm going to use getattr as a stand-in for your custom function which accpets an object and an integer 1 to 6.

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

    By specifying 'uni', 0, the output doesn't have to be scalar and will be put into a cell array. This is useful when, for example, you have a multi-element array for your position.

    This is equivalent to the following loop:

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

    If ever in doubt about cellfun or arrayfun, just write a loop first - they are essentially the same but more concise.