Inline Indexing to Dynamic Field Names

7 views (last 30 days)
How can I integrate and index function output into dynamic field names?
Say function y=fun(x) outputs an array of integers.
How can I implement:
Varnames=['var1' 'var2' 'varx' 'vary'];
TestStruct.(Varnames(index(fun(x),3))) = 0;
that is equivalent to: (for instance)
TestStruct.varx = 0;
or better yet, if varx is an array, a way to make it equivalent to:
TestStruct.varx(n) = 0;
Is there a way to tell a function that you are only interested int the nth element?
Thanks in advance,

Accepted Answer

Oleg Komarov
Oleg Komarov on 8 Sep 2011
I felt Walter was a challenge, I shouldn't be suggesting stuff like this...
Varnames = {'var1', 'var2', 'varx', 'vary'};
x = [2 4 1 3];
n = 3;
TestStruct.(Varnames{x*accumarray(n,1,[numel(x),1])}) = 0
or better
s = struct('type','()','subs',{{n}});
TestStruct.(Varnames{subsref(x,s)}) = 0
  1 Comment
Sean on 28 Sep 2011
Thanks Oleg... I had developed my own way of doing this with a custom indexer function, but I much prefer to do it with inbuilt matlab functionality than having extraneous personal functions involved.
The method I used was to add a function equivalent to:
function x=indexer(y,n)
that I used like:
TestStruct.Varnames{indexer(fun(x),n)} = 0;

Sign in to comment.

More Answers (1)

Chaowei Chen
Chaowei Chen on 31 Aug 2011
Varnames={'var1', 'var2', 'varx', 'vary'};
%if varx is scalar
TestStruct.(Varnames{1,3}) = 0
%if varx is array
Walter Roberson
Walter Roberson on 8 Sep 2011
Well, you can. But it is ugly and obscure and would have even experienced MATLAB programmers trying to figure out what is going on. A simple loop would be shorter, faster, and much much clearer.

Sign in to comment.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!