如何在IDL中的阵列内部存储阵列?

时间:2019-02-26 14:56:45

标签: idl-programming-language

我试图将一组一维IDL数组存储在IDL中的二维数组中。我找不到有关Harris Geospatial的任何文档,也没有运气只是想弄清楚语法。

3维数组似乎是显而易见的解决方案,但是我需要存储的1D数组的长度在1到800个整数之间,因此我将很少使用3D数组。

任何指针都值得赞赏。 谢谢。

1 个答案:

答案 0 :(得分:1)

您的声明

  

非常感谢任何指针

有点讽刺意味,因为解决您的问题的一种可能方法是使用指针!据我所知,这是将可变长度数组存储在单个数组中的唯一方法。基本上,指针只是变量,但是它们不包含数据,而是包含指向数据在内存中存储位置的指针。

您可以使用PTR_NEW函数创建指针:

IDL> p = ptr_new(findgen(5))                                                                                                                                      
IDL> help, p                                                                                                                                                      
P               POINTER   = <PtrHeapVar22> 

要“取消引用”指针(即访问数据),您需要使用星号:

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,以供进一步参考。