2010-08-04 114 views
5

我可能會用錯誤的方法解決這個問題,但我正在嘗試在循環中定義和填充數組。在循環中定義數組名稱

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 

這顯然是行不通的,但有使用由「行」定義的字符串方式+ strtrim(1,2),以創建和填充在每個迭代一個新的陣列?在這種情況下,我會有40個名稱爲line0 ... 39的數組。這裏困難的部分是sz [1]不同,所以我不能簡單地定義一個大陣列來容納一切。

回答

2

好吧,如果你心情惡劣(並且不需要它運行在未經許可的虛擬機安裝上),總是會有execute函數。

但是你有沒有考慮過申明一個一維數組指針,其中每個元素指向你的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 
3

在IDL 8.0或更高版本,你可以使用HASH數據類型此。

你將代碼如下所示:

line = array_dict['line01'] 

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 

您現在可以通過名稱來訪問您的陣列