今天给大家介绍下怎么用IDL语言读写多维数组。以下面这个三维数组为例
3585 1368 114 56 52 29 25 14
3586 1368 111 56 51 28 24 14
3587 1368 112 54 51 29 24 14
3588 1368 110 54 49 29 23 12
3589 1368 110 54 49 28 21 14
3590 1368 109 54 49 27 22 13
3591 1368 108 53 47 28 24 14
3592 1368 107 52 47 28 25 14
3585 1369 111 56 52 29 25 14
3586 1369 113 55 51 28 23 12
3587 1369 114 55 50 28 23 14
3588 1369 110 54 49 28 22 13
3590 1369 108 53 49 28 22 14
3591 1369 107 52 47 28 24 13
3592 1369 106 52 47 28 24 13
3585 1370 111 56 51 29 25 14
3586 1370 112 56 50 28 24 14
3587 1370 111 54 49 28 23 13
首先我们要考虑如果如果我们知道这个文本文件中的数组大小。即这个数组是三维,8列 6行。
那么直接创建数组然后读进来就可以
;samples,lines,bands分别是列、行、维度
data = MAKE_ARRAY(samples,lines,bands,TYPE=1)
OPENR,lun,filename,/GET_LUN
READF,lun,data
FREE_LUN,lun
PRINT,data
但是大多数情况下,在数据量很大的情况下。我们不可能直接读。那么我们要读这个文本文件里面的列,行,和维度。然后才能读取数据。
那么我们来试一下。代码如下
PRO test_BILL_A
filename = FILE_DIRNAME(ROUTINE_FILEPATH('test_BILL_A'))+$
'\三维数据.txt' ;读取文件
;sample 行数
;bands维数
;lines 行数
;获取sample
OPENR,lun,filename,/get_lun
WHILE ~EOF(lun) DO BEGIN
str = ''
READF,lun,str ;读了一行数据
IF STRTRIM(str) NE '' THEN BEGIN
sample = N_ELEMENTS(STRSPLIT(str)) ;读取列数
BREAK
ENDIF
ENDWHILE
FREE_LUN,lun
;eof用于判断文件指针的位置,如果在开头结尾返回1,如果在开头返回0
;STRSPLIT用于判断字符串之间空格的位置
;breakBack语句提供了一种方便的方法,可以立即从循环(for、foreach、while、Repeat)、case或Switch语句中退出,而无需理会Goto语句。
bands = 1L
lines = 0L
blank = 0
OPENR,lun,filename,/GET_LUN
WHILE ~EOF(lun) DO BEGIN
str = ''
READF,lun,str
IF STRTRIM(str) EQ '' AND blank EQ 1 THEN BEGIN
bands++
blank++
ENDIF ELSE IF STRTRIM(str) NE '' THEN BEGIN
blank = 1
lines++
ENDIF ELSE IF STRTRIM(str) EQ '' AND blank GT 1 THEN BEGIN
blank++
ENDIF
ENDWHILE
FREE_LUN,lun
IF blank GE 2 THEN bands--
PRINT, 'samples: ', sample
PRINT, 'lines: ', lines/bands
PRINT, 'bands: ', bands
;获取数据
data = MAKE_ARRAY(sample,lines/bands,bands,TYPE=1)
OPENR,lun,filename,/GET_LUN
READF,lun,data
FREE_LUN,lun
PRINT,data
END
其实还是非常简单的,大家如果对其中的函数不清楚,就去查查文档。相信你会得到答案的。