在循环中定义数组名称
问题描述:
我可能会用错误的方法解决这个问题,但我正在尝试在循环中定义和填充数组。在循环中定义数组名称
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]不同,所以我不能简单地定义一个大阵列来容纳一切。
答
好吧,如果你心情恶劣(并且不需要它运行在未经许可的虚拟机安装上),总是会有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
答
在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
您现在可以通过名称来访问您的阵列