【问题标题】:How to declare variables in for loop? (IDL)如何在for循环中声明变量? (IDL)
【发布时间】:2009-12-19 09:37:31
【问题描述】:

例如,

我的文件以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 循环中和做数学时声明变量吗?

(我的母语不是英语。如果我的问题有什么不清楚的地方,请告诉我。谢谢!)

【问题讨论】:

标签: idl-programming-language


【解决方案1】:

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

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

如果我正确理解您的问题,您想替换一维数组 a0a1b0b1 等来自您的第一个示例,带有二维数组 ab、 等等,其中每个数组都有维度(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 它期望的简单变量名,然后复制它们 到二维变量的子数组中。

如果您事先不知道每个文件中有多少样本,您可以分配 第一次循环迭代期间的二维数组:

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

当然,这一切都假设每个文件包含相同数量的样本。如果不, 您可能需要将abcd 更改为一维指针数组, 然后使用PTR_NEW 为您读取的每个文件的数据分配内存。

(请注意,我使用方括号 [] 表示法进行数组索引,我找到了 比a(i)b(i) 等更容易阅读,这可能会与函数调用混淆。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 2021-08-29
    相关资源
    最近更新 更多