Одна проблема с подходом 1 состоит в том, что каждый 'начинает или заканчивает строку, но вы хотите, чтобы некоторые из них были частью строки, которую предполагается создать. Вам нужно два 'для этого:
[mean vars] = eval(['extfunc( sprintf('',eV%d'', (50:10:80)'') '')']);
Это все равно не будет делать то, что вы хотите. Если вы хотите, чтобы строка создавалась для каждого элемента 50:10:80
, вам понадобится цикл.
Проблема со вторым подходом, вероятно, заключается в том, что ваш extfunc
возвращает вектор / массив / матрицу (для mean
; обратите внимание, что вы не записываете variance
таким образом), но ваше назначение m(i)= ...
может занять только скалярные значения. Если mean
является вектором, попробуйте m(i,:)=...
.
Однако я бы предпочел поставить под сомнение ваш общий подход к работе со строками и eval
здесь. Если так легко переименовать переменные, почему бы не поместить их в массив ячеек или (n + 1) -мерную матрицу и заставить ваши функции работать с фактическим содержимым переменных вместо строк с именами переменных?
[править: вводящая в заблуждение "из" -> "или" до "(n + 1) -мерная матрица"]
Редактировать в ответ на отредактированный вопрос:
Хотя цель SO не состоит в том, чтобы позволить другим людям выполнять вашу работу, то, что вы хотите, кажется довольно простым:
year = 50:10:100;
for i=1:length(year)
cmdstr = ['[m' int2str(i) ' v' int2str(i) '] = extfunc(eV' int2str(year(i)) ');'];
eval(cmdstr);
end
Если по какой-то причине вы предпочитаете sprintf
конкатенации массивов символов, попробуйте
cmdstr = sprintf('[m%d v%d]=extfunc(eV%d);',i,i,year(i))
вместо этого. Я не уверен, что использование eval
и разных имен переменных является более элегантным решением вашей проблемы, чем сбор eV50
, eV60
и т. Д. В одной матрице, например, eV(:,:,:,1) = eV50; eV(:,:,:,2) = eV60;
и т. Д. Или массив ячеек и работающий с ним, если только исходный источник данных не является двоичным файлом MATLAB с переменными, названными таким образом.