Динамическое присвоение значений в Matlab - PullRequest
1 голос
/ 30 августа 2011

У меня есть cellarray, значения которого используются для инициализации соответствующих структур.

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

Яне может выполнить desired statement, даже используя eval.Буду признателен за вашу помощь.filldata количество выводов будет соответствовать LHS desired statement.Спасибо.

1 Ответ

0 голосов
/ 30 августа 2011

Вот возможное решение для 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}
%#...
...