tags:

views:

382

answers:

2

I have a function that returns one or more variables, but as it changes (depending on whether the function is successfull or not), the following does NOT work:

[resultA, resultB, resultC, resultD, resultE, resultF] = func(somevars);

This will sometimes return an error, varargout{2} not defined, since only the first variable resultA is actually given a value when the function fails. Instead I put all the output in one variable:

output = func(somevars);

However, the variables are defined as properties of a struct, meaning I have to access them with output.A. This is not a problem in itself, but I need to count the number of properties to determine if I got the proper result.

I tried length(output), numel(output) and size(output) to no avail, so if anyone has a clever way of doing this I would be very grateful.

+6  A: 
length(fieldnames(output))

There's probably a better way, but I can't think of it.

Matthew Flaschen
nah, that's probably the best.
Jason S
+1  A: 

It looks like Matthews answer is the best for your problem:

nFields = numel(fieldnames(output));

There's one caveat which probably doesn't apply for your situation but may be interesting to know nonetheless: even if a structure field is empty, FIELDNAMES will still return the name of that field. For example:

>> s.a = 5;
>> s.b = [1 2 3];
>> s.c = [];
>> fieldnames(s)

ans = 

    'a'
    'b'
    'c'

If you are interested in knowing the number of fields that are not empty, you could use either STRUCTFUN:

nFields = sum(~structfun(@isempty,s));

or a combination of STRUCT2CELL and CELLFUN:

nFields = sum(~cellfun('isempty',struct2cell(s)));

Both of the above return an answer of 2, whereas:

nFields = numel(fieldnames(s));

returns 3.

gnovice

related questions