Ваше утверждение,
Любые указатели, которые высоко ценятся
несколько иронично, учитывая, что одним из возможных решений вашей проблемы является использование указателей!Насколько мне известно, это единственный способ хранить массивы переменной длины в одном массиве.По сути, указатели являются просто переменными, но вместо того, чтобы содержать данные, они содержат указатель на место хранения данных в памяти.
Вы можете создать указатель с помощью функции 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$
Вот документация для дальнейшего использования.