Как найти сумму элементов массива с помощью программы idl\gdl?

Я использую программу readfits.pro для чтения файла FITS. который дает массив типа структуры. Какую программу использовать, чтобы найти сумму элементов полученного массива?


person Arya Stark    schedule 13.06.2017    source источник
comment
добавьте то, что вы пробовали до сих пор   -  person Abdul    schedule 13.06.2017
comment
Я пробовал checksum32.pro и tsum.pro, но оба выдают ошибку, что нельзя добавить массив типа структуры.   -  person Arya Stark    schedule 13.06.2017


Ответы (2)


Функция TOTAL может быть тем, что вам нужно. Если в вашей структуре есть поле «field1», и вы хотите сложить эти значения из структур в вашем массиве «structArray», это должно работать:

field1Total = Всего (structArray.field1)

person Dick Jackson    schedule 13.06.2017
comment
Опять же, элементы структуры не могут быть добавлены в эту контекстную ошибку. - person Arya Stark; 14.06.2017
comment
Я не знаю имен ваших переменных, но в этом контексте что вы получаете от HELP, structArray, /STRUCTURE и HELP, structArray.field1? Вторая проблема: глядя на readfits.pro, он должен возвращать числовой массив, а не массив структурного типа. Пожалуйста, покажите немного кода, хотя бы ваш звонок в READFITS. - person Dick Jackson; 14.06.2017
comment
Это то, что я получаю, используя mrdfits. - person Arya Stark; 15.06.2017
comment
Возможно, вы захотите изучить, как работают структуры, поля и массивы, пока не освоитесь с ними. См. примеры IDL в интерактивной справке для массивов структур или спросите кого-нибудь. После моего первого комментария ваш массив структур (structArray), полученный из MRDFITS, будет b, так что же вы получите от HELP, b, /STRUCTURE? В нем будет указано по крайней мере одно имя поля, поэтому попробуйте HELP, b._thatFieldName_, и я думаю, что fieldTotal = Total(b._thatFieldName_) должно сработать, чтобы добавить три числа, которые вы прочитали. - person Dick Jackson; 17.06.2017
comment
Я не знаю, требуются ли в вашем файле FITS другие параметры для ваших вызовов READFITS или MRDFITS для правильного получения данных — возможно, вам придется это проверить. Похоже, вы получили массив байтов размером (4, 2), когда READFITS считывает две строки в a, и каждый набор из четырех байтов фактически составляет значения с плавающей запятой (IDL> print,float([180b, 233b, 53b, 42b], 0, 1) дает 1.61571e-013). Ожидаете ли вы значения с плавающей запятой в этом диапазоне? Бьюсь об заклад, что fieldTotal = Total(Float(a, 0, 2)) (потому что в a есть 2 строки) даст сумму этих двух чисел, которые вы читаете. - person Dick Jackson; 17.06.2017
comment
Кроме того, могу ли я добавить, что вы дали неверные данные в своем исходном вопросе (readfits.pro не дает структурного результата, а mrdfits.pro дает). Вы получите лучшую помощь, если будете более осторожны в своих вопросах. - person Dick Jackson; 17.06.2017

Я могу ответить за случай использования MRDFITS, который вы описали в комментариях к ответу Дика Джексона,

b=mrdfits('/home/bhuvi/Desktop/data/S60501010021alif4ttagfca‌​l (2).fit',
1,range=[3112,3114]) MRDFITS: Binary table. 1 columns by 3 rows. 

GDL> print,b { 1.61571e-13}{ 1.06133e-13}{ 1.06137e-13}

Я думаю, что вы получаете массив структур. И похоже, что каждая структура имеет одно поле, заполненное одним числом с плавающей запятой. Чтобы проиллюстрировать, я определил массив этих структур, используя ваши значения для b, и я произвольно назвал поле «данные»:

b= [{data:1.61571e-13},{data:1.06133e-13},{data:1.06137e-13}]

Я получаю тот же результат, что и вы, когда печатаю его:

IDL> print, b
{  1.61571e-13}{  1.06133e-13}{  1.06137e-13}

Итак, я почти уверен, что именно так выглядят ваши данные. Чтобы убедиться в этом, help ваш друг.

IDL> help, b
B                     STRUCT   = -> <Anonymous> Array[3]

Это говорит вам, что b является массивом структур. Вы можете передать ключевое слово /structure (сокращенно /str), чтобы получить информацию о составе структур в массиве:

IDL> help, b, /str
** Structure <beb6f8>, 1 tags, length=4, data length=4, refs=1:
   DATA            FLOAT       1.61571e-13

Это говорит о том, что первый элемент массива b представляет собой структуру с полем под названием «данные», которое указывает на значение с плавающей запятой 1,61571e-13. В качестве альтернативы вы можете просто использовать help с отдельными структурами, индексируя массив b:

IDL> help, b[0]
** Structure <beb6f8>, 1 tags, length=4, data length=4, refs=2:
   DATA            FLOAT       1.61571e-13
IDL> help, b[1]
** Structure <beb6f8>, 1 tags, length=4, data length=4, refs=2:
   DATA            FLOAT       1.06133e-13
IDL> help, b[2]
** Structure <beb6f8>, 1 tags, length=4, data length=4, refs=2:
   DATA            FLOAT       1.06137e-13

Я нахожу массивы структур очень полезными, потому что вы можете легко просмотреть отдельную структуру или легко создать массив из определенного поля из всех структур. Другими словами, чтобы получить ваши данные, просто используйте нотацию «структура. поле», и у вас есть вектор, состоящий из чисел с плавающей запятой из каждой из трех структур в массиве:

IDL> print, b.data
  1.61571e-13  1.06133e-13  1.06137e-13

Наконец, чтобы получить сумму, используйте total(), как предложил Дик Джексон:

IDL> print, total(b.data)
  3.73841e-13
person Steve G    schedule 13.12.2017