YAMAHAgb1的个人博客分享 http://blog.sciencenet.cn/u/YAMAHAgb1

博文

IDL使用笔记 (持续更新)

已有 29999 次阅读 2012-10-10 16:47 |个人分类:系统之类|系统分类:科研笔记| IDL

博主主要把科学网博客当作记笔记的地方,所以如果有小伙伴们有问题要找我,请联系我的邮箱,kxguo@pmo.ac.cn(因已离开紫台,保留到2016年底) 以及pmoguo@gmail.com(长期有效)


可用于帮助的链接(10/10/2012)

 NASA那个(也包括NASA以外的) http://idlastro.gsfc.nasa.gov/

 http://www.idlcoyote.com/             ;这哥们太牛了

编程习惯 (10/10/2012)
 IDL 8已经彻底不认( )作为矩阵及数组元素下标,务必习惯使用[ ]


痛定思痛(17/01/2014)

 为了避免CODE跑不完睡办公室的悲剧继续发生,以后务必在循环中加上这么一条

 TIME=22 ;假设晚上10点还跑不完就暂时中断,保留目前所有变量(包括循环进度)

  if string(strmid((strsplit(systime(0,/utc),/extract))[3],0,2),format='(i)') gt TIME then stop

  save,filename='current_loop.sav'
 到分钟的是把0,2换成3,4

Q & A (10/10/2012)
窗口遮挡的情况
 device, retain=2 (retain 可取值 0,1,2 其他未有研究)
 或 window, retain=2

IDL 8里各种包相冲突的情况
 错误提示如: % Compiled module: LEGEND.
            % Attempt to call undefined procedure/function: 'LEGEND'.
            % Keyword DIMENSION not allowed in call to: MOMENT
 解决方法: 在.bashrc中调整IDL_PATH路径顺序,使NASA包置于系统默认路径前,实在不行就把当前用错的pro重命名,强迫IDL只选择同名程序里需要的。
           查找当前生效程序路径:print, file_which('moment.pro')

 或使用compile_spf.pro选择具体要使用的程序包(refer to: 蔡振翼同学 from SISSA 14/11/2013)https://www.dropbox.com/s/9pjdhviw5dbipzw/compile_spf.pro

 

 refer to:  http://www.rhinocerus.net/forum/lang-idl-pvwave/652723-keyword-dimension-not-allowed-call-moment.html
           http://www.idlcoyote.com/ng_tips/idl8_name_conflicts.html
           http://www.idlcoyote.com/misc_tips/idlsetup.html (设置startup文件)

终端下运行IDL路径配置文件:(11/01/2013)
 以CSH为例运行AstroSetup.csh来加入需要的路径名称。
 即在home目录终端下执行:source ./AstroSetup.csh
 AstroSetup.csh的内容为:
 setenv IDL_PATH ''<IDL_DEFAULT>''
 setenv IDL_PATH /home/.../Astrocode:${IDL_PATH}
 绿色部分为程序包路径名

读数据文件
 1)csv etc. 用readcol
 2)极品catalog见博主第二篇博文用VIM补全catalog里的缺失列

 3)最方便的方法是下载topcat (java版运行:java -jar topcat-full.jar)用ASCII读取tbl形式的catalog后,另存成fits格式方便IDL调用。

笔记(杂)
 数组中心: n_elements(array)/2 + (n_elements(array) mod 2-1)*0.5

 用psf_gaussian生成PSF,单位为/beam:psf=psf_gaussian(fwhm=fwhm,npixel=[paxis1,paxis2])

用hist_2d和contour结合起来画非图像数据二维contour图 (30/8/2012)
 举个栗子(主要关键字用绿色标出):
 画a,b两属性的contour图 (如a=alog10(findgen(50)*1e9) 为lg(stellar mass), b=alog10(findgen(10)+1)+23 为M_r的情况)
 re3=hist_2d(a,b,bin1=0.05,bin2=0.05)
 contour,re3,levels=10^(findgen(6)/5.)*20,/noerase,color=220,xst=1+4,yst=1+4,xrange=[0,54],yrange=[0,39]


字符串操作 (04/06/2013)

http://liangshzh0816.blog.163.com/blog/static/3477676201041410340126/


合并坐标数组:(04/12/2012)
 reform & transpose  举个栗子:
 a=[28.3, 56.2] & b=[27.6, 56.3]
 c=[reform(a,1,2), reform(b,1,2)] & d=transpose(c)

改变数组维度:(10/01/2013)
1)数组 a[i, j, k] 在各维度上的大小为 nx, ny, nz, 对应于一维数组 a[*]的 a[nx*ny*k + nx*j + i]
 同样的,数组a[*]的第 N+1个元素(对应一维数组下标N)对应于三维数组 a[N mod nx, N/nx mod ny, N/nx/ny]
 注意:以上所有数均为自然数

2) 数组变形 reform

new_1d_array=reform(2d_array, n_elements(2d_array))

举个例子,要得到一个盒子里坐标分别为[1,1] [1,2],[1,3],[2,1],[2,2],[2,3],[3,1],[3,2],[3,3]的9个元素的x,y坐标数组即[1,1,1,2,2,2,3,3,3]和[1,2,3,1,2,3,1,2,3]

make_2d,[1,2,3],[1,2,3],sx,sy得到的sx,sy即为3X3坐标矩阵

cx=reform(sx,9) & cy=reform(sy,9) cx,cy即为需要的9个元素的坐标数组

   其他维度之间的转换可以将n_elements(2d_array)变成 nx,ny,如:

a=reform(sx,3,3) 相当于没有转化,a和sx相同。


使用@调用和运行分支(Branch)函数: (11/01/2013)
 @调用的称为branch函数,用法为 另起一行@Branch_name
 全部使用程序中定义过的变量,并返回Branch函数中所有有定义的变量。有非常方便的地方,但是也容易混淆。使用要小心。IDL6.4给的栗子为 @surf01,其中surf01函数调用了 @cntour01。 由help可以看到cntour01中定义的变量全部返回在主程序中。

使用mpfitfun必要的两个link: (1/2/2013)
 http://www.eg.bucknell.edu/physics/ASTR201/IDLTutorial/tutorial_05.html
 http://www.physics.wisc.edu/~craigm/idl/mpfittut.html

清除所有已定义的变量: (8/2/2013)
.reset_session 或 .full_reset_session 已试验命令行中.reset就可以

其他有关全局变量和局域变量可参考 http://liangshzh0816.blog.163.com/blog/static/34776762010412940915/


关键字错误“Ambiguous keyword abbreviation“ (18/4/2013)

IDL的关键字原则是"Keywords can be abbreviated to their shortest unique length",这就是为什么我们可以在画图的时候只用“xs”代替"xsize".所以如果在编写程序时程序头出现了开头几个字母相同的不同变量(比如同时定义了两个关键字data和data_err),那么IDL就会产生混乱。

保险的办法是使不同的关键字至少开头三个字母不相同,比如在上面的例子中可以把data_err改为err

http://cow.physics.wisc.edu/~craigm/idl/archive/msg06802.html


矩阵运算 (待补充)(4/6/2013)

求行列式值:determ.pro

求逆: la_invert.pro

遇到错误"Singular Matrix encountered" 说明矩阵不可逆,对应行列式值为0.找到问题行列办法为循环去掉某行/列(行列数相同),使新矩阵可逆----2014/6/4更新算法,发现利用分块矩阵行列式的运算性质更方便。

构造对角矩阵:diag_matrix(dblarr(20)+1) 为20X20对角阵,可利用diag_matrix(dblarr(20)+1,40)+diag_matrix(dblarr(40)+1,-20)构造60X60分块对角阵。


外部调用错误 in call-external (10/7/2013)

错误类型:wrong ELF class: ELFCLASS32wrong ELF class: ELFCLASS64

原因: IDL版本(即32位/64位)与所调用程序编译所用的lib不同

IDL解决办法:查看idl目前版本:print,!version.memory_bits 输出64即64位,输出32即32位

如提示错误ELFCLASS32即退出IDL重新进入idl -32更换为64位。反之………………安装64位吧亲,推荐安装相同发行版本 (LZ仍然在用6.4),不用重新定义路径。也许可以使用32位lib重新编译外部程序,LZ系linux系统小白,未尝试。


fedora 24 gnome环境正常安装IDL 8.2后无法打开帮助(?)的问题(10/10/2016)

错误提示:

IDL> ?
IDL> No value set for `/desktop/gnome/url-handlers/http/command'
                                                               Unable to locate a browser for use with ONLINE_HELP. Please consider using the IDL_HELP_BROWSER environment variable to specify a browser.
                                                                                         idl_help_browser
% Attempt to call undefined procedure/function: 'IDL_HELP_BROWSER'.
% Execution halted at: $MAIN$          
IDL>
猜测原因:桌面环境未指定浏览器打开方式

解决方法:按照错误提示,在用户环境变量.bashrc中加上一行(以默认用firefox作为帮助浏览窗口为例):

    export IDL_HELP_BROWSER=firefox
    csh用户请自觉修改export为sentenv,

哒哒!

参考链接:http://www.exelisvis.it/Domestico/Notizieeaggiornamenti/TabId/1227/ArtMID/4226/ArticleID/5190/5190.aspx


MPFIT错误:Error detected while calling MPFIT_FDJAC2

如果使用mpfit时出现错误如:

% MPFIT: Error detected while calling MPFIT_FDJAC2:
% MPFIT: Out of range subscript encountered: FJAC.
% MPFIT: Error condition detected. Returning to MAIN level.
很有可能是function返回值格式有错,比如如果原来的返回值是[1,3]的array,返回array[*]变为3元素的1维数组即可解决问题
参考链接(需翻墙)https://groups.google.com/forum/#!topic/comp.lang.idl-pvwave/A1vfUq2aS38


IDL中浮点数运算有效位数问题

有时会出现a=b,但是a-b不等于0的情况如:

IDL>a=43.866565

IDL>print,a,format='(f20.15)'

43.866565704345703

比较笨的解决方法:使用double(string(a))的方式能以1e-15的精确度逼近a




https://blog.sciencenet.cn/blog-773206-621131.html

上一篇:用VIM补全catalog的缺失列
下一篇:工具+书签 (持续更新)
收藏 IP: 124.205.77.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (2 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-28 07:08

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部