我是IDL的新手。我有一个数据文件由4列,96行(保存为new.dat)组成。我试图读取值只有当第二列是积极但无法做到。编译好但没有输出。帮助,请???
data=fltarr(4,96)
openr,1,'new.dat'
openw,2,'file.dat'
readf,1,data
for i=0,95 do begin
if (data(1,*) ge 0) then printf,2, data
endfor
close,/all
答案 0 :(得分:0)
嗯,这里有几件事要提。
首先,当您在IDL中索引数组时,应使用[]
而不是()
来避免混淆和编译错误。
第二,在你的陈述中
if (data(1,*) ge 0) then printf,2, data
每次在IF语句中进行测试时,您都会尝试打印整个数据文件。
第三,您没有为FORMAT
语句指定READF
语句,应该这样做。
第四,您是否尝试索引数组data
的第二维?如果是这样,您需要在i
循环中使用FOR
。
第五,只是读入数据并使用它会更容易吗?一个[4,96]元素数组非常小,每次需要时都需要几分之一秒才能读取。然后,您可以使用WHERE
例程来确定哪些元素大于零。例如,您可以尝试(在FOR
循环中):
good = WHERE(data[*,i] GE 0,gd)
变量good
将包含满足test语句的所有索引。
第六,我应该说你可以而且应该在不使用WHERE
循环的情况下使用FOR
。您可以执行以下操作:
good = WHERE(data GE 0,gd)
并且变量good
将仅包含data
≥0的元素。要索引data
,您只需执行与以下内容类似的操作:
data_pos = data[good]
如果您希望将新变量data_pos
与data
保持相同的维度,那么您可以在IDL中使用ARRAY_INDICES
例程,并将data_pos
的其余索引保留为你定义的一些虚拟值,知道以后不再使用。
答案 1 :(得分:0)
如果您使用http://idlastro.gsfc.nasa.gov/ftp/pro/misc/readcol.pro
中的“readcol
”,您的代码可能会变得更加轻松
以下是示例代码:
openw, filenumber, 'file.dat', /get_lun
readcol, 'new.dat', data0, data1, data2, data3, count=num_read
for i=0,num_read-1 do begin
if data1[i] gt 0 then printf,2, data2[i]
endfor
free_lun, filenumber
另一个代码是:
openw, lun,'file.dat', /get_lun
readcol, 'new.dat', data0, data1, data2, data3, count=num_read
select = where(data1 gt 0, num_select)
for i=0,num_select-1 do printf,2, data2[i]
free_lun, lun
请注意,在打开文件时最好使用/ get_lun,这样您就不必在编码时手动跟踪打开的逻辑单元号。