определить имя массива в цикле - PullRequest
5 голосов
/ 05 августа 2010

Возможно, я поступаю неправильно, но я пытаюсь определить и заполнить массивы в цикле.

for i = 0,39 do begin

xx = long(findgen(n+1l)*sx + line1x[i]) 
sz = size(xx)
arrayname = 'line' + strtrim(i,2)
arrayname = findgen(3,sz[1])
arrayname[0,*] = xx
arrayname[1,*] = yy
arrayname[2,*] = vertline

endfor

Это, очевидно, не будет работать, но есть ли способ использовать строку, определенную как 'line' + strtrim (i, 2), для создания и заполнения нового массива при каждой итерации? В этом случае у меня было бы 40 массивов с именами line0 ... 39. Сложность заключается в том, что sz [1] изменяется, поэтому я не могу просто определить один большой массив для хранения всего.

Ответы [ 2 ]

3 голосов
/ 22 февраля 2011

В idl 8.0 или более поздней версии вы можете использовать для этого тип данных HASH.

Ваш код будет выглядеть следующим образом:

array_dict = hash()
for ii = 0,39 do begin
  xx = long(findgen(n+1l)*sx + line1x[ii]) 
  sz = size(xx)
  arrayname = 'line' + string(1, FORMAT='(i02)')
  array = findgen(3,sz[1])
  array[0,*] = xx
  array[1,*] = yy
  array[2,*] = vertline

  array_dict[arrayname] = array
endfor

Теперь вы можете получить доступ к своим массивам по имени:

line = array_dict['line01']
2 голосов
/ 06 августа 2010

Ну, всегда есть функция execute, если вы настроены на грязный хак (и не нуждаетесь в ней для установки на нелицензированной виртуальной машине).

Но рассматривали ли вы вопрос об объявлении одномерного массива указателей, где каждый элемент указывает на один из ваших 3 подузлов sz? Это дает вам некоторые преимущества одного большого массива, без ограничения всех подмассивов, имеющих одинаковую форму. Это может выглядеть примерно так ...

ptrs=ptrarray(40) ; Allocate an array of 40 pointers, initialized to null

for i = 0,39 do begin
  ; calculate sz, xx, yy, vertline
  dummy=findgen(3,sz[1])
  dummy[0,*] = xx
  dummy[1,*] = yy
  dummy[2,*] = vertline
  ptrs[i]=ptr_new(dummy) ; create copy of dummy on the heap, storing pointer in ptrs[i]

endfor

; To access the i-th subarray...

(*ptrs[i])[0,*] = new_xx
(*ptrs[i])[1,*] = new_yy
(*ptrs[i])[2,*] = new_vertline
...