Предположим, мы загрузили данные в массив ячеек:динамическая переменная декларация
DATA={'foo',[1,5];'bar',[2,6]}
Есть ли способ, как объявлять переменные, названные 1-й столбец в DATA
с содержанием 2-й колонке?
Предположим, мы загрузили данные в массив ячеек:динамическая переменная декларация
DATA={'foo',[1,5];'bar',[2,6]}
Есть ли способ, как объявлять переменные, названные 1-й столбец в DATA
с содержанием 2-й колонке?
Там в assignin
функция, которая принимает имя переменной и присвоить ему определенное значение:
for r = 1:size (DATA, 1)
assignin ('caller', DATA{r,:});
end
Вы можете сделать это с помощью eval
for ii = 1:size(DATA,1)
eval([DATA{ii,1}, ' = ', num2str(DATA{ii,2})]);
end
Однако использование eval
является not recommended.
Вы можете использовать динамические имена полей вместо:
s = cell2struct(DATA(:,2), DATA(:,1), 2);
это не будет охватывать случаи, когда переменная не является вектором, например матрицей ND (или даже 2D-матрицей), массивом ячеек, структурами и т. Д. – carandraug
+1 Иногда 'eval' - это способ пойти –
@ carandraug you являются правильными. Я использовал 'num2str' вместо моего личного любимого' sprintf' просто для покрытия простых векторов. Но у 'eval' действительно есть ограничения. Может быть, в сочетании с 'disp'? Я предпочитаю структуру с динамическими именами ... – Shai
это не будет работать в функции. или, что еще хуже, он будет работать с неожиданными результатами: переменные будут назначаться в '' base'', а не в контексте функции: O – Shai
@Shai ups! Вы правы. Я неправильно понял 'base' и' caller', я думал, что 'caller' был 1 уровень вниз в стеке и основывает текущую область. – carandraug