2014-09-02 3 views
-2

У меня есть следующий код в Python, и я хотел бы реализовать что-то подобное в MATLAB без использования синтаксиса eval, если это возможно.Создать переменное имя в цикле в Matlab из кода Python

Цель состоит в том, чтобы создать горизонтальные & вертикальные векторы из нерегулярной матрицы и сохранить их как переменную. В python это прямолинейно, но у меня возникают проблемы с реализацией этого в MATLAB без использования eval. Есть идеи? Спасибо заранее!

например, в Python:

x,y = 3,5 


matrix = np.zeros((x,y)) 

matrix_T = matrix.reshape(y,x) 

array_names_y = ['name_y_%d' %i for i in xrange(y)] 

array_names_x = ['name_x_%d' %i for i in xrange(x)] 


for i in xrange(len(array_names_x)): 

    for name,row in zip(array_names_x,matrix): 

      globals()[name]=row 

for i in xrange(len(array_names_y)): 

    for name,column in zip(array_names_y,matrix_T): 

      globals()[name]=column 

Выход Somthing так:

колонны:

name_y_0 = [ 0. 0. 0.] 

name_y_1 = [ 0. 0. 0.] 

name_y_2 = [ 0. 0. 0.] 

name_y_3 = [ 0. 0. 0.] 

name_y_4 = [ 0. 0. 0.] 

rows: 

name_x_0 = [ 0. 0. 0. 0. 0.] 

name_x_1 = [ 0. 0. 0. 0. 0.] 

name_x_2 = [ 0. 0. 0. 0. 0.] 

Я хочу сделать это, чтобы потом применить анализ для каждой строки/столбца вектор.

+0

можно объяснить немного больше о том, что вы хотите? – Kasramvd

+7

*** ARGH !!! *** Почему?!? Зачем вам это делать? Динамически создающие переменные ** никогда не делают правильных действий. Мое предложение: изменить свой код на python на * not * mess с 'globals()', а затем код будет отображать почти 1-к-1 в MATLAB (таким образом, решая также проблему, которую вы задали). Прочитайте [Как сделать ряд переменных A1, A2, A3, ... A10?] (Http://www.mathworks.com/matlabcentral/answers/143-how-do-i-make-a-series -of-variables-a1-a2-a3-a10) – Bakuriu

+1

Не можете ли вы использовать массив ячеек? Но если вы хотите это сделать, то почему бы не использовать 'eval'? Это ужасная идея, о которой упомянул Бакуриу, но если вы настаиваете на этом, то использование «eval» - это «правильный» подход. Но, как я уже сказал, скорее используйте массивы ячеек или структуры – Dan

ответ

0

Вы можете использовать sturct с динамическими именами

for ii = 1:size(matrix,1) 
    nm = sprintf('name_x_%d',ii-1); 
    st.(nm) = matrix(ii,:); 
end 
for ii = 1:size(matrix,2) 
    nm = sprintf('name_y_%d',ii-1); 
    st.(nm) = matrix(:,ii).'; 
end 

начиная с

>> matrix = rand(3,5); 

Вы в конечном итоге с

>> st 

st = 

name_x_0: [0.7268 0.3005 0.5994 0.4717 0.0194] 
name_x_1: [0.7780 0.3819 0.8218 0.4820 0.3969] 
name_x_2: [0.2287 0.6207 0.4578 0.5712 0.2943] 
name_y_0: [0.7268 0.7780 0.2287] 
name_y_1: [0.3005 0.3819 0.6207] 
name_y_2: [0.5994 0.8218 0.4578] 
name_y_3: [0.4717 0.4820 0.5712] 
name_y_4: [0.0194 0.3969 0.2943] 

Но, пожалуйста, пожалуйста, пожалуйста , ПОЖАЛУЙСТА слушать Bakuriu.

+0

Голосование, потому что я не думаю, что удушения на дне достаточно. Для меня это не полезно. Весь подход должен быть сильно обескуражен. – Schorsch

+1

@Schorsch: Но не является ли такая структура более похожей на подход к массиву ячеек, хотя она сохраняет более значимые имена, а не только индексы? Ссылка MathWorks от @Bakuriu выше предлагает аналогичный подход. Или динамические имена 'struct' фактически аналогичны именам' eval'? – horchler

+0

@horchler Личные предпочтения, здесь (и неприятие анонимных голосов для ответов). Я думаю, что что-то вроде 'st.name {1,1} .x' или' st.name {1,1} .y' является более чистым. Кроме того, использование индексации, начинающееся с '0' (даже в именах), может привести к путанице позже, потому что Matlab не использует индекс' 0'. – Schorsch

Смежные вопросы