Как объявить переменные в цикле for? (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

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

Поэтому я хочу использовать цикл for для генерации: 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

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

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


person user235048    schedule 19.12.2009    source источник
comment
Используйте словари! Смотрите этот пост для объяснения и примера, который точно соответствует вашей ситуации: pyaos.johnny-lin.com /?p=755   -  person mankoff    schedule 13.08.2011


Ответы (1)


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

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

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

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 простые имена переменных, которые она ожидает, а затем копирует их в подмассивы двумерных переменных.

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

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 на одномерные массивы указателей, а затем использовать PTR_NEW для выделения памяти для данных каждого файла по мере его чтения.

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

person Jim Lewis    schedule 24.01.2010