如何在 IDL 中将数组存储在数组中?
How Do I Store An Array Inside An Array In IDL?
我试图在 IDL 的二维数组中存储一组一维 IDL 数组。我找不到任何关于 Harris Geospatial 的文档,而且我运气不好,只是在乱搞语法。
3 维数组似乎是显而易见的解决方案,但我需要存储的 1 维数组的长度在 1 到 800 个整数之间变化,因此我将使用很少的 3 维数组。
非常感谢任何指点。
谢谢。
你的陈述,
Any pointers much appreciated
有点讽刺,因为您的问题的一种可能解决方案是使用指针!据我所知,这是将可变长度数组存储在单个数组中的唯一方法。基本上,指针只是变量,但它们不包含数据,而是包含指向数据在内存中存储位置的指针。
您可以使用PTR_NEW
函数创建一个指针:
IDL> p = ptr_new(findgen(5))
IDL> help, p
P POINTER = <PtrHeapVar22>
到"dereference"指针(即访问数据),需要使用星号:
IDL> print, p
<PtrHeapVar22>
IDL> print, *p
0.00000 1.00000 2.00000 3.00000 4.00000
所以,你需要的是一个PTRARR
(指针数组):
IDL> test_arr = ptrarr(2,3,/ALLOCATE_HEAP)
IDL> help, test_arr
TEST_ARR POINTER = Array[2, 3]
其中数组的每个元素都是您的一维数组之一。您可以通过存储指针来填充数组:
IDL> test_arr[0,0] = p
IDL> print, *test_arr[0,0]
0.00000 1.00000 2.00000 3.00000 4.00000
或者通过将数组分配给指针数组的取消引用元素:
IDL> *test_arr[0,1] = randomu(seed, 4)
IDL> print, *test_arr[0,1]
0.838449 0.967399 0.0669304 0.101592
使用指针的一个缺点是您会失去很多(如果不是全部的话)普通 IDL 数组的向量化优点。也就是说,您通常需要遍历数组的元素才能访问存储在指针中的值,这意味着您会受到性能影响。
另一件需要注意的事情是运算符优先级如何影响取消引用运算符(星号)的使用。例如,如果你在一个指针中存储一个结构体,你需要通过如下方式使用括号来访问结构体中的数据:
IDL> str = {a:1,b:'x'}
IDL> str_ptr = ptr_new(str)
IDL> print, (*str_ptr).a
1
否则会报错:
IDL> print, *str_ptr.a
% Expression must be a structure in this context: STR_PTR.
% Execution halted at: $MAIN$
这里是 documentation 供进一步参考。
我试图在 IDL 的二维数组中存储一组一维 IDL 数组。我找不到任何关于 Harris Geospatial 的文档,而且我运气不好,只是在乱搞语法。
3 维数组似乎是显而易见的解决方案,但我需要存储的 1 维数组的长度在 1 到 800 个整数之间变化,因此我将使用很少的 3 维数组。
非常感谢任何指点。 谢谢。
你的陈述,
Any pointers much appreciated
有点讽刺,因为您的问题的一种可能解决方案是使用指针!据我所知,这是将可变长度数组存储在单个数组中的唯一方法。基本上,指针只是变量,但它们不包含数据,而是包含指向数据在内存中存储位置的指针。
您可以使用PTR_NEW
函数创建一个指针:
IDL> p = ptr_new(findgen(5))
IDL> help, p
P POINTER = <PtrHeapVar22>
到"dereference"指针(即访问数据),需要使用星号:
IDL> print, p
<PtrHeapVar22>
IDL> print, *p
0.00000 1.00000 2.00000 3.00000 4.00000
所以,你需要的是一个PTRARR
(指针数组):
IDL> test_arr = ptrarr(2,3,/ALLOCATE_HEAP)
IDL> help, test_arr
TEST_ARR POINTER = Array[2, 3]
其中数组的每个元素都是您的一维数组之一。您可以通过存储指针来填充数组:
IDL> test_arr[0,0] = p
IDL> print, *test_arr[0,0]
0.00000 1.00000 2.00000 3.00000 4.00000
或者通过将数组分配给指针数组的取消引用元素:
IDL> *test_arr[0,1] = randomu(seed, 4)
IDL> print, *test_arr[0,1]
0.838449 0.967399 0.0669304 0.101592
使用指针的一个缺点是您会失去很多(如果不是全部的话)普通 IDL 数组的向量化优点。也就是说,您通常需要遍历数组的元素才能访问存储在指针中的值,这意味着您会受到性能影响。 另一件需要注意的事情是运算符优先级如何影响取消引用运算符(星号)的使用。例如,如果你在一个指针中存储一个结构体,你需要通过如下方式使用括号来访问结构体中的数据:
IDL> str = {a:1,b:'x'}
IDL> str_ptr = ptr_new(str)
IDL> print, (*str_ptr).a
1
否则会报错:
IDL> print, *str_ptr.a
% Expression must be a structure in this context: STR_PTR.
% Execution halted at: $MAIN$
这里是 documentation 供进一步参考。