2010-08-04 21 views
5

Być może idę o tym w niewłaściwy sposób, ale próbuję definiować i wypełniać tablice wewnątrz pętli.Zdefiniuj nazwę tablicy w pętli

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 

To oczywiście nie będzie działać, ale czy istnieje sposób na wykorzystanie ciąg znaków zdefiniowany przez „linii” + strtrim (i, 2) tworzenie i wypełnić nową tablicę momencie każdej iteracji? W tym przypadku miałbym 40 tablic z nazwami line0 ... 39. Trudną częścią jest to, że sz [1] jest różna, więc nie mogę po prostu zdefiniować jednej dużej tablicy do przechowywania wszystkiego.

Odpowiedz

2

Cóż, zawsze jest funkcja execute, jeśli masz ochotę na paskudny hack (i nie musisz jej uruchamiać na nielicencjonowanej instalacji maszyny wirtualnej).

Ale czy zastanawiałeś się nad deklaracją 1-D tablicy wskaźników, gdzie każdy element wskazuje na jedną z twoich subarrayów 3 na sz? Daje to pewną korzyść z jednej dużej tablicy, bez ograniczenia wszystkich podbarw, które muszą mieć ten sam kształt. To może wyglądać mniej więcej tak ...

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 
3

in IDL 8.0 lub później można użyć HASH typ danych w tej sprawie.

Twój kod będzie wyglądać następująco:

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 

Możesz teraz uzyskać dostęp do swoich tablic według nazwy:

line = array_dict['line01'] 
Powiązane problemy