Обработка строки трехмерных переменных в MATLAB - PullRequest
1 голос
/ 01 августа 2011

Я пытался написать скрипт для обработки строки трехмерных переменных, eV50, eV60, eV70 и т. Д. (Имеется в виду извлеченное значение из 1950, 1960, 1970 и т. д. Эти трехмерные переменные имеют размер 31x145x192.) в строку трехмерного вывода, то есть m1, m2, m3 и т. д. (размерность 1x145x192).

Это может быть довольно простым для некоторых из вас, но я выдернул свои волосы в последние 24 часа, пытаясь заставить это работать. Я попробовал эти два подхода, используя циклы и EVAL, но у меня возникают проблемы с пониманием скобки '' в выражении, поэтому я думаю, именно поэтому я не смог правильно сбалансировать уравнение.

* X - это набор данных eV50, eV60, eV70 и т. Д. (Что означает извлеченное значение из 1950, 1960, 1970 и т. Д.)

В основном я пытаюсь превратить этот скрипт в цикл или что-то подобное:

'[m1 v1] = extfunc (eV50);
[m2 v2] = extfunc (eV60);
[m3 v3] = extfunc (eV70);
[m4 v4] = extfunc (eV80);
[m5 v5] = extfunc (eV90);
[m6 v6] = extfunc (eV100);
и так далее... «


Подход 1:

'[mean vars] = eval ([' extfunc (sprintf (', eV% d', (50:10:80) ')') ']); «


Подход 2:

* Я переименовал eV50, eV60, eV70 в eV1, eV2, eV3 и так далее ...

'для i = 1: 6

m (i) = extfunc_h (sprintf ('eV% d', i));

конец '

Использование extfunc: -

[mean variance] = extfunc(eV50)

В подходе 1, у меня есть несбалансированные уравнения, и в подходе 2 MATLAB вернул сообщение об ошибке

??? Показатель превышает размеры матрицы.'


Ответы [ 2 ]

1 голос
/ 01 августа 2011

Не совсем понятно, каким должен быть ввод для extfunc (что такое X) - это единственная переменная, т.е. ev50 или список переменных?

В любом случае, проблема в первом подходе заключается в том, что sprintf создает следующую строку:

,eV50,eV60,eV70,eV80

так что у вас есть дополнительные , в начале. Кроме того, он подходит, только если extfunc получает список переменных в качестве входных данных. В противном случае вам следует переформатировать строку.

1 голос
/ 01 августа 2011

Одна проблема с подходом 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 с переменными, названными таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...