Как я могу хранить массив внутри массива в IDL? - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь сохранить набор одномерных массивов IDL внутри двумерного массива в IDL.Я не могу найти какую-либо документацию по Harris Geospatial, и мне не повезло, что я просто разобрался с синтаксисом.

Трехмерный массив кажется очевидным решением, но длина одномерных массивов, которые мне нужно хранить, варьируется от 1- 800 целых чисел, так что я бы использовал очень мало трехмерного массива.

Любые указатели очень ценятся.Спасибо.

1 Ответ

0 голосов
/ 26 февраля 2019

Ваше утверждение,

Любые указатели, которые высоко ценятся

несколько иронично, учитывая, что одним из возможных решений вашей проблемы является использование указателей!Насколько мне известно, это единственный способ хранить массивы переменной длины в одном массиве.По сути, указатели являются просто переменными, но вместо того, чтобы содержать данные, они содержат указатель на место хранения данных в памяти.

Вы можете создать указатель с помощью функции 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] 

где каждый элемент массива является одним из ваших 1-D массивов.Вы можете заполнить массив, сохранив указатели:

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$  

Вот документация для дальнейшего использования.

...