Я использую программу readfits.pro для чтения файла FITS. который дает массив типа структуры. Какую программу использовать, чтобы найти сумму элементов полученного массива?
Как найти сумму элементов массива с помощью программы idl\gdl?
Ответы (2)
Функция TOTAL может быть тем, что вам нужно. Если в вашей структуре есть поле «field1», и вы хотите сложить эти значения из структур в вашем массиве «structArray», это должно работать:
field1Total = Всего (structArray.field1)
HELP, structArray, /STRUCTURE
и HELP, structArray.field1
? Вторая проблема: глядя на readfits.pro, он должен возвращать числовой массив, а не массив структурного типа. Пожалуйста, покажите немного кода, хотя бы ваш звонок в READFITS.
- person Dick Jackson; 14.06.2017
structArray
), полученный из MRDFITS, будет b
, так что же вы получите от HELP, b, /STRUCTURE
? В нем будет указано по крайней мере одно имя поля, поэтому попробуйте HELP, b._thatFieldName_
, и я думаю, что fieldTotal = Total(b._thatFieldName_)
должно сработать, чтобы добавить три числа, которые вы прочитали.
- person Dick Jackson; 17.06.2017
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
Я могу ответить за случай использования MRDFITS, который вы описали в комментариях к ответу Дика Джексона,
b=mrdfits('/home/bhuvi/Desktop/data/S60501010021alif4ttagfcal (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