【问题标题】:How Do I Store An Array Inside An Array In IDL?如何在 IDL 中将数组存储在数组中?
【发布时间】:2019-02-27 04:00:25
【问题描述】:

我正在尝试将一组一维 IDL 数组存储在 IDL 中的二维数组中。我找不到有关 Harris Geospatial 的任何文档,而且我只是在语法上乱七八糟。

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

非常感谢任何指针。 谢谢。

【问题讨论】:

    标签: idl-programming-language


    【解决方案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 以供进一步参考。

    【讨论】:

    • 这正是我所需要的,谢谢!从非常基础的伟大解释。非常感激。 3D 数组的大小使其速度非常慢,保存为 .sav (80GB) 时大小也很荒谬。当我只将内容存储在
    猜你喜欢
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    • 2022-11-27
    • 2015-07-11
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多