2009-12-19 10 views
2

Например,Как объявить переменные в цикле? (IDL)

Мои файлы именования после 00.dat, 01.dat, 02.dat ..., каждый файл содержит несколько столбцов, и я использую READCOL, чтобы читать их в переменные.

for i = 0, n-1 do begin 
    readcol, string(i, F='(I02)')+'.dat', F='D,D', a0, b0 
    readcol, string(i, F='(I02)')+'.dat', F='D,D', a1, b1 
    . 
    . 
    c1 = a1/a0 
    c2 = a2/a0 
    . 
    . 
    d1 = b1/b0 
    d2 = b2/b0 
    . 
    . 
endfor 

Это прекрасно работает, но я не могу напечатать все varialbes один за другим, если будет, скажем, сто переменных.

Поэтому я хочу использовать для цикла для генерации: a (i), b (i), c (i), d (i). В этом смысле, код будет выглядеть следующим образом:

for i = 0, n-1 do begin 
    readcol, string(i, F='(I02)')+'.dat',F='D,D', a(i), b(i) 
endfor 

for i = 0, n-1 do begin 
    c(i) = a(i)/a(0) 
    d(i) = b(i)/b(0) 
endfor 

Но это не работает, есть ли способ, чтобы объявить переменные в цикле и при этом математику?

(Я не носителем английского языка. Пожалуйста, дайте мне знать, если есть что-то неясно, на мой вопрос. Спасибо!)

+0

Используйте словари!См. Это сообщение для объяснения и примера, это ваша точная ситуация: http://pyaos.johnny-lin.com/?p=755 – mankoff

ответ

5

Приятно видеть другого программиста IDL на StackOverflow!

Я думаю, что часть проблемы заключается в том, что READCOL ожидает простые имен переменных для его выходов, и в вашем втором примере вы даете ему выражение массива как a(i) и b(i) вместо a и b.

Если я правильно понимаю ваш вопрос, вы хотите заменить 1-мерные массивы a0, a1, b0, b1 и т.д. из первого примера, с 2-мерных массивов a, b, и т.д., где каждый массив имеет размеры (nfiles, samples_per_file). Так что, если вы знаете, заранее, сколько строк будет читаться из каждого файла, вы могли бы сделать что-то вроде этого:

a=dblarr(n,samples_per_file) 
b=dblarr(n,samples_per_file) 
; similarly for c, d, etc. 

for i = 0, n-1 do begin 
    readcol, string(i, F='(I02)')+'.dat',F='D,D', x, y 
    a[i,*] = x 
    b[i,*] = y 
    c[i,*] = x/x[0] 
    d[i,*] = y/y[0] 
endfor 

Эта версия проходит READCOL простые имена переменных он ожидает, а затем копирует их в подмассивов из 2-D переменные.

Если вы не знаете заранее, сколько образцов в каждом файле, можно выделить в 2-D массивов во время первой итерации цикла:

for i = 0, n-1 do begin 
    readcol, string(i, F='(I02)')+'.dat',F='D,D', x, y 
    if (i EQ 0) then begin 
     samples_per_file = n_elements(x) 
     a = dblarr(n, samples_per_file) 
     b = dblarr(n, samples_per_file) 
     c = dblarr(n, samples_per_file) 
     d = dblarr(n, samples_per_file) 
    endif 
    a[i,*] = x 
    b[i,*] = y 
    c[i,*] = x/x[0] 
    d[i,*] = y/y[0] 
endfor 

Конечно, все это предполагает, что каждый файл содержит одинаковое количество выборок. Если нет, то вы, вероятно, потребуется изменить a, b, c и d к 1-мерные массивы указателей, затем использовать PTR_NEW для выделения памяти для данных каждого файла, как вы читаете это.

(Обратите внимание, что я использовал квадратные скобки [] обозначение для индексации массива, который я нахожу немного легче чем читать a(i), b(i) и т.д., которые могут быть спутаны с вызовами функций.)

Смежные вопросы