Indexing structure fields?

Hi! I’m trying to get an index list of structure fields

``````>> aa.val                 ##  test struct
ans = L1
ans = L2
ans = N
>> aa(:).val               ##  how to tell a boy kitten from a girl kitten :-)
ans = L1
ans = L2
ans = N
>>v=aa(:).val
v = L1                       ##  this isn't what I expected
``````

I’ve even tried various

``````cell2mat(fieldnames(aa)(1))
ans = type
>> aa.cell2mat(fieldnames(aa)(1))
error: structure has no member 'cell2mat'
>> aa(cell2mat(fieldnames(aa)(1)))
error: aa(121): out of bound 3 (dimensions are 1x3)
``````

with no luck

How does one manipulate a structure without knowing what its fields are, like in a function?

Thanks
Doug

`aa(:).val` returns a comma-separated-list. See Comma Separated Lists Generated from Structure Arrays (GNU Octave (version 6.4.0))

You could convert that to a cell array with `{aa(:).val}`.

1 Like

Thanks [mmuetzel]
But, at least on the command line,

``````v=aa(:).val      ## returns a 2-character string
v = L1
``````

but

``````v={aa(:).val}     ## returns a cell array
v =
{
[1,1] = L1
[1,2] = L2
[1,3] = N
}
``````

Is the 1st case a bug?

So,
`strcmp("L2", {aa(1,:).type}) => [0 1 0]`
Whew!

Thanks again
Doug

Hi saintrain.

Isn’t a bug. When you’re calling `aa(:).val`, it returns the values as separate variables, if
you get the return as:

`[a,b,c] = a(:).val`

you can get all those elements but if you only write `v = a(:).val`, you will get only the first.

`v = {aa(:).val}` return all the elements agrupated into a matrix as mmuetzel says

1 Like

In many cases it is ok to think of a comma-separated-list (cs-list) as a substitute for the literal comma separated list.
E.g., `s(1).f=1; s(2).f=2;`, then `s(:).f` stands for `1, 2`. In an assignment `a=s(:).f;`, you could substitute to `a=1, 2;`. That makes clear more intuitively why `a=1` after that assignment.
On the other hand, `b={s(:).f};` substitutes to `b={1, 2};`.

HTH

Thanks @89453728 and @mmuetzel!
I get it now.

1 Like