例如,
我的文件以 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 循环和做数学时声明变量吗?
(我的母语不是英语。如果我的问题有任何不清楚的地方,请告诉我。谢谢!)
最佳答案
很高兴在 StackOverflow 上看到另一位 IDL 程序员!
我认为部分问题在于 READCOL
需要简单的变量名称
它的输出,在你的第二个例子中,你给它数组表达式,比如
a(i)
和 b(i)
而不是 a
和 b
。
如果我正确理解你的问题,你想替换一维数组
第一个示例中的 a0
、a1
、b0
、b1
等,具有二维数组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
它所期望的简单变量名称,然后复制它们
到二维变量的子数组中。
如果您事先不知道每个文件中有多少个样本,您可以分配 第一次循环迭代期间的二维数组:
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)
等更容易阅读,这些可能会与函数调用混淆。)
关于idl-programming-language - 如何在for循环中声明变量? (IDL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1932480/