How can I integrate and index function output into dynamic field names?
Example:
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,

 採用された回答

Oleg Komarov
Oleg Komarov 2011 年 9 月 8 日

0 投票

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 件のコメント

Sean
Sean 2011 年 9 月 28 日
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)
x=y(n);
that I used like:
TestStruct.Varnames{indexer(fun(x),n)} = 0;

サインインしてコメントする。

その他の回答 (1 件)

Chaowei Chen
Chaowei Chen 2011 年 8 月 31 日

1 投票

Varnames={'var1', 'var2', 'varx', 'vary'};
%if varx is scalar
TestStruct.(Varnames{1,3}) = 0
%if varx is array
TestStruct=struct(Varnames{1,3},zeros(10,1))

4 件のコメント

Paulo Silva
Paulo Silva 2011 年 8 月 31 日
+1 vote
Sean
Sean 2011 年 8 月 31 日
I'm sorry... maybe I wasn't clear enought in my request.
"TestStruct.(Varnames{1,3}) = 0" works if I can get the relevant value. But if y=fun(x) returns something of the form [5 7 2 6] then I have passed an array to Varnames() instead of the desired value when I write:
TestStruct.(Varnames(fun(x)))=0
How can I (inline) tell it I am only interested in the value at a particular index (for example index 3)?
Thanks
Jan
Jan 2011 年 9 月 8 日
@Sean: You can't. Do not waste time with searching for an inline version. Simply use a FOR loop to access a list of fields.
Walter Roberson
Walter Roberson 2011 年 9 月 8 日
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.

サインインしてコメントする。

カテゴリ

ヘルプ センター および File Exchange で Function Creation についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by