2011-08-29 6 views
1

J'ai un cellarray dont les valeurs sont utilisées pour initialiser les structures correspondantes.Affectation de valeur dynamique dans 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 

Les nouvelles valeurs sont ensuite remplies dans le champ 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 

Je ne suis pas en mesure d'exécuter le desired statement, même en utilisant eval. J'apprécierai votre aide. filldata le nombre de sortie correspond à celui de LHS de desired statement. Merci.

+0

Connaissez-vous [les références de structure dynamique] (http://blogs.mathworks.com/loren/2005/12/13/use-dynamic-field-references/)? Souvent, leur utilisation judicieuse résout le besoin d '«évaluer» - et ils sont assez rapides. –

+0

@Reve_etrange merci! – Maddy

Répondre

0

Voici une solution possible pour 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); 

Comme dans tout autre langage interprété, l'utilisation de EVAL n'est pas la meilleure pratique (mais vous semblez savoir déjà). À moins que vous devez spécifiquement avoir des variables dont le nom ne peut être déterminée lors de l'exécution, j'utiliser des tableaux de cellules ou tableau de structures à la place (en fonction de vos besoins):

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

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