如何只从数据文件中读取正值

时间:2015-01-11 12:09:10

标签: arrays if-statement conditional idl

我是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

2 个答案:

答案 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_posdata保持相同的维度,那么您可以在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,这样您就不必在编码时手动跟踪打开的逻辑单元号。