2011-08-29 47 views
1

我有一个cellarray它的值用来初始化相应的结构。在Matlab中动态赋值

cellarr = {'NI' ; 'EQ' ; 'TA' } ; 
defstr = struct('Raw', '-1') ; 

for i = 1:size(cellarr,1) 
    eval([cellarr{i,1} '= defstr;']) %Yes,I know eval is bad!Any other approach? 
end 

然后将新值填入Raw字段。

dataCell = [] ; 
for i=1:size(cellarr,1) 
    rawCell = [cellarr{i} '.Raw'] ; 
    dataCell = strcat(dataCell, ', ', rawCell) ; 
end 
dataCell(1) = [] ; 

DESIRED STATEMENT NOW --> [NI.Raw,Eq.Raw,TA.Raw] = filldata() 

function[a1,a2,a3] = filldata(), a1 = 1 ; a2 = 2 ; a3 = 3 ; end 

我不能即使使用eval执行desired statement。应感谢您的帮助。 filldata输出计数将匹配desired statement的LHS的输出计数。谢谢。

+0

你熟悉[动态结构引用] (http://blogs.mathworks.com/loren/2005/12/13/use-dynamic-field-references/)?通常他们的明智用途决定了对“eval”的需求 - 而且它们非常快。 –

+0

@Reve_etrange谢谢! – Maddy

回答

0

这里是EVAL一个可能的解决方案:

%# build and eval the string: [NI.Raw,Eq.Raw,TA.Raw] = filldata() 
str = sprintf('%s.Raw,',cellarr{:}); 
str = sprintf('[%s] = filldata()', str(1:end-1)); 
eval(str); 

与在其他任何解释语言,使用的EVAL是不是最好的做法(但你似乎已经知道了)。 除非你特别需要有变量,其名称只能在运行时,我会用电池阵列或结构的阵列,而不是被确定(根据您的需要):

N = 3; 
result = cell(N,1); 
[result{:}] = filldata(); 

%# now you can access the data as: 
result{1} 
result{2} 
%#...