如何在for循环中声明变量?(IDL)

use*_*048 2 idl-programming-language

例如,

我的文件在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
Run Code Online (Sandbox Code Playgroud)

这样可以正常工作,但如果有一百个变量,我不能逐个输入所有变量.

因此,我想使用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
Run Code Online (Sandbox Code Playgroud)

但是这不起作用,是否有任何方法在for循环中声明变量并且在进行数学运算时?

(我不是以英语为母语的人.如果我的问题中有任何不清楚的地方,请告诉我.谢谢!)

Jim*_*wis 5

很高兴在StackOverflow上看到另一个IDL程序员!

我认为问题的一部分READCOL是期望输出的简单变量名称,在第二个例子中,你给它的数组表达式 代替a(i)b(i)而不是ab.

如果我正确理解您的问题,要替换的一维数组 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
Run Code Online (Sandbox Code Playgroud)

这个版本传递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
Run Code Online (Sandbox Code Playgroud)

当然,这都假定每个文件包含相同数量的样本.如果没有,你可能需要改变a,b,c,和d为指针的一维数组,然后使用PTR_NEW每个文件的数据,你读它分配内存.

(注意,我使用方括号[]表示数组索引,我发现它比等等更容易阅读a(i),b(i)可能与函数调用混淆.)