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

这显然行不通,但是有没有办法使用 'line' + strtrim(i,2) 定义的字符串在每次迭代时创建和填充一个新数组?在这种情况下,我将有 40 个名称为 line0...39 的数组。这里的困难部分是 sz[1] 变化,所以我不能简单地定义一个大数组来保存所有内容。

4

2 回答 2

3

在 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']
于 2011-02-22T00:49:47.123 回答
2

好吧,execute如果您有心情进行肮脏的黑客攻击(并且不需要它在未经许可的虚拟机安装上运行),总有这个功能。

但是您是否考虑过声明一个一维指针数组,其中每个元素指向您的 3 by 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
于 2010-08-06T06:52:44.650 回答