создание переменной, которая меняет размеры в цикле for

Мне нужно создать файл соответствия, используя данные из двух структур IDL. Это не основная проблема.

Моя проблема в том, что сначала мне нужно создать переменную, содержащую две структуры. Чтобы создать это, я использовал цикл for, который будет записывать на каждом шаге новую строку моей переменной. Проблема в том, что я не могу добавить новую строку на следующем шаге, она перезаписывает ее, поэтому в конце мой файл подходит вместо 10000 строк, я не знаю, он имеет только одну строку.

Это то, что я также пробовал

for jj=0,h[1]-1 do begin

  test[*,jj] = [sme.wave[jj], sme.smod[jj]]
  print,test
endfor

но подстановочный знак * все портит, потому что теперь внутри test у меня есть число, соответствующее jj, а не значения sme.wave и sme.smod.

Я надеюсь, что кто-то может понять, что я спросил, и это может мне помочь! заранее спасибо!

Кьяра


person user2390713    schedule 16.05.2013    source источник


Ответы (1)


Предполагая, что ваши поля структуры «sme.wave» и «sme.smod» содержат одномерные массивы с тем же количеством элементов, что и строк в «test», тогда ваш код должен работать. Например, я попробовал это и получил следующий результат:

IDL> test = intarr(2, 10)  ; all zeros
IDL> sme = {wave:indgen(10), smod:indgen(10)*2}
IDL> for jj=0, 9 do test[*,jj] = [sme.wave[jj], sme.smod[jj]]
IDL> print, test
       0       0
       1       2
       2       4
       3       6
       4       8
       5      10
       6      12
       7      14
       8      16
       9      18

Однако для лучшей оптимизации скорости вам следует вместо этого сделать следующее и воспользоваться преимуществами многопоточных операций с массивами IDL. Зацикливание обычно намного медленнее, чем что-то вроде следующего:

IDL> test = intarr(2, 10)  ; all zeros
IDL> sme = {wave:indgen(10), smod:indgen(10)*2}
IDL> test[0,*] = sme.wave
IDL> test[1,*] = sme.smod
IDL> print, test
   0       0
   1       2
   2       4
   3       6
   4       8
   5      10
   6      12
   7      14
   8      16
   9      18

Далее, если вы заранее не знаете, какой размер у "теста", и хотите добавить к переменной, т.е. добавить строку, то можно сделать так:

IDL> test = []
IDL> sme = {wave:Indgen(10), smod:Indgen(10)*2}
IDL> for jj=0, 9 do test = [[test], [sme.wave[jj], sme.smod[jj]]]
IDL> Print, test
   0       0
   1       2
   2       4
   3       6
   4       8
   5      10
   6      12
   7      14
   8      16
   9      18
person spacemanjosh    schedule 06.09.2013