|||
博主主要把科学网博客当作记笔记的地方,所以如果有小伙伴们有问题要找我,请联系我的邮箱,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
字符串操作 (04/06/2013)
http://liangshzh0816.blog.163.com/blog/static/3477676201041410340126/
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相同。
其他有关全局变量和局域变量可参考 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: ELFCLASS32 或 wrong 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,
哒哒!
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
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-7 05:14
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社