搜索此博客

显示标签为“IDL”的博文。显示所有博文
显示标签为“IDL”的博文。显示所有博文

2018年6月6日星期三

IDL Plot函数绘制散点图时设置透明度

目标:
如图1散点图中如果点数太多,簇与簇之间的混淆则难以辨识。因而,希望通过更改某一类簇的透明度来清晰表现不同类簇之间的混淆性与可分性。
图1 散点图

IDL中PLOT函数的关键字:

Syntax


graphic = PLOT(Y, [Format] [, Keywords=value] [, Properties=value])
graphic = PLOT(X, Y, [Format] [, Keywords=value] [, Properties=value])
graphic = PLOT(Equation, [Format] [, Keywords=value] [, Properties=value])

Keywords

Keywords are applied only during the initial creation of the graphic.
AXIS_STYLE=value
/BUFFER, /CURRENT, /DEVICE, DIMENSIONS=[width, height], LAYOUT=array, LOCATION=[x, y], MARGIN=scalar or [left, bottom, right, top], /NO_TOOLBAR, /NODATA, /OVERPLOT, /WIDGETS

Properties

Properties can be set as keywords to the function during creation, or retrieved or changed using the "." notation after creation.

参数有很多,与目标相关的参数为SYM_TRANSPARENCY,范围为0-100。其中,默认值为0,即不透明,100为完全透明。

SYM_TRANSPARENCY

An integer between 0 and 100 that specifies the percent transparency of the symbols. The default value is 0.

Reference:


2018年6月4日星期一

Break Line Difference of PrintF and WriteU keyword of IDL『IDL PrintF(默认换行输出)与WriteU(默认不换行输出)打印输出差异』

目的:

利用IDL实现打印输出如下表:


实现:
   ;设置第一行纹理特征名称
    Corr_Name = [ ' ' ,'Mean ' ,'Variance ' ,'Homogeneity ' ,'Contrast ' ,'Dissimilarity ' ,'Entropy ' ,'Second_Moment ' ,'Correlation ' ]

    ;输出第一行纹理特征名
    PrintF , FYI_LUN , Corr_Name
    FOR ii = 0,7 DO BEGIN
      ;输出第一列纹理特征名

      WriteU , FYI_LUN , Corr_Name[ii + 1]

      ;输出各项纹理特征值
      PrintF , FYI_LUN , Correlation_FYI[* , ii]
    ENDFOR

2018年5月21日星期一

Sentinel-1影像数据陆地掩模与dB值转换(IDL Programming)

;+
; :Author: Baikal
;-
; Request: .zip format source file should be stored in the same directory
; with the processed folder using the procSentinelRTC_recipe.py script.
;
; Purpose:
; Mask land areas and convert pixel values to dB.
; -Version: 1.0
; Time: Sep.24,2017
;
; First Modification:
; Purpose:
; To sovle abnormal display of pixel values in elevation file and HH&VV output img.
; Time : Sept.25,2017
;
; Second Modification:
; Purpose:
; To clip the image based on Mask_Sea file rather than elevation image.
; -Version: 2.0
; Time : Oct.20,2017
; Third Modification:
; Purpose:
; To add modification of header file.
; -Version: 2.0
; Time : Oct.21,2017


PRO Mask_Land_To_dB_V2

  COMPILE_OPT idl2

  ;给定文件路径
  directory = 'C:\Users\Baikal\Desktop\test\'
  ;查找zip文件
  file = file_search(directory,count = num,'*.zip')
  for id = 0,num-1 DO BEGIN
    ;获取文件名
    file_name = strmid(file[id],70,67,/Reverse_Offset)

    ;获取HH极化与HV极化影像路径
    Image_HH = directory + file_name + '\' + file_name + "_TNR_OB_CAL_TC.data\" + "Beta0_HH.img"
    Image_HV = directory + file_name + '\' + file_name + "_TNR_OB_CAL_TC.data\" + "Beta0_HV.img"

    ;获取HH极化与HV极化影像头文件路径
    HH_hdr = directory + file_name + '\' + file_name + "_TNR_OB_CAL_TC.data\" + "Beta0_HH.hdr"
    HV_hdr = directory + file_name + '\' + file_name + "_TNR_OB_CAL_TC.data\" + "Beta0_HV.hdr"

    ;获取HH极化影像的掩膜文件路径(掩膜文件中仅含有陆地区域)
    Image_HH_Mask = directory + file_name + '\' + file_name + "_TNR_OB_CAL_TC(Mask_Sea).data\" + "Beta0_HH.img"

    ;查找影像中是否有已经存在的转为dB值的文件,若有,则删除
    ;    HH_file = file_search(directory + file_name + '\' + file_name + "_TNR_OB_CAL_TC.data\",'Aim_Beta0_HH.hdr')
    ;    IF HH_file THEN  FILE_DELETE,HH_file
    ;    HV_file = file_search(directory + file_name + '\' + file_name + "_TNR_OB_CAL_TC.data\",'Aim_Beta0_HV.hdr')
    ;    IF HV_file THEN  FILE_DELETE,HV_file
    ;    HH_HV_file = file_search(directory + file_name + '\' + file_name + "_TNR_OB_CAL_TC.data\",'Aim_Beta0_HH_HV.hdr')
    ;    IF HH_HV_file THEN  FILE_DELETE,HH_HV_file

    ;对HH、HV、HH/HV极化影像的三个波段进行波段合成
    header_path = directory + file_name + '\' + file_name + "_TNR_OB_CAL_TC.data\"
    FILE_COPY, HH_hdr, header_path + 'Aim_Beta0_HH.hdr'
    FILE_COPY, HV_hdr, header_path + 'Aim_Beta0_HV.hdr'
    FILE_COPY, HV_hdr, header_path + 'Aim_Beta0_HH_HV.hdr'
    Aim_HH_hdr    = header_path + 'Aim_Beta0_HH.hdr'
    Aim_HV_hdr    = header_path + 'Aim_Beta0_HV.hdr'
    Aim_HH_HV_hdr = header_path + 'Aim_Beta0_HH_HV.hdr'
    ;复制生成转为dB值文件的头文件
    Output_Directory = directory + file_name + '\Composition\'
    file_mkdir, Output_Directory
    FILE_COPY, HV_hdr, Output_Directory + 'Layer Stacking.hdr'
    LS_hdr = Output_Directory + 'Layer Stacking.hdr'

    ;将头文件中的内容进行修改
    OPENU,hdr_lun,Aim_HH_hdr,/get_lun
    line    = 'band names = { Beta0_HH }'
    replace = 'band names={Aim_Beta0_HH}'
    Skip_Lun,hdr_lun,10,/lines
    Point_lun,-hdr_lun,line
    printf,hdr_lun,replace
    CLOSE,hdr_lun & FREE_LUN, hdr_lun

    OPENU,hdr_lun,Aim_HV_hdr,/get_lun
    line    = 'band names = { Beta0_HV }'
    replace = 'band names={Aim_Beta0_HV}'
    Skip_Lun,hdr_lun,10,/lines 
    Point_lun,-hdr_lun,line
    printf,hdr_lun,replace
    CLOSE,hdr_lun & FREE_LUN, hdr_lun

    OPENU,hdr_lun,Aim_HH_HV_hdr,/get_lun
    line    = 'band names = { Beta0_HV }'
    replace = 'band names={Beta0_HH_HV}'
    Skip_Lun,hdr_lun,10,/lines
    Point_lun,-hdr_lun,line
    printf,hdr_lun,replace
    CLOSE,hdr_lun & FREE_LUN, hdr_lun

    OPENU,hdr_lun,LS_hdr,/get_lun
    line_Band  = 'bands = 1'
    replace_line_Band = 'bands = 3'
    Skip_Lun,hdr_lun,4,/lines
    Point_lun,-hdr_lun,line_Band
    printf,hdr_lun,replace_line_Band
    CLOSE,hdr_lun & FREE_LUN, hdr_lun
   
    OPENU,hdr_lun,LS_hdr,/get_lun
    line_Band_Name    = 'band names = { Beta0_HV }'
    replace_Band_Name = 'band names={HH,HV,HH_HV}'
    Skip_Lun,hdr_lun,10,/lines
    Point_lun,-hdr_lun,line_Band_Name
    printf,hdr_lun,replace_Band_Name
    CLOSE,hdr_lun & FREE_LUN, hdr_lun

    ;打开HH极化的头文件
    OPENR,hdr_lun,HH_hdr,/get_lun
    ;设立一个存储头文件行数值的变量
    line = ''
    WHILE (~EOF(hdr_lun)) DO BEGIN
      ;读取一行数据
      READF,hdr_lun,line
      tmp = strsplit(line[0],'=',/extract)
      ;利用空格( )获得影像的头文件参数信息
      header_keyword = Strsplit(tmp[0], ' ', /extract)
      ;按照头文件中变量名字获得相应的参数
      IF header_keyword[0] EQ 'samples' THEN xs = LONG(tmp[1])
      IF header_keyword[0] EQ 'lines' THEN ys = LONG(tmp[1])
      IF header_keyword[0] EQ 'data type' THEN type = LONG(tmp[1])
    ENDWHILE
    ;关闭并释放头文件指针
    CLOSE,hdr_lun & FREE_LUN, hdr_lun

    ;读取HH极化影像数据
    OPENR,HH_unit,Image_HH,/get_lun
    HH = MAKE_ARRAY(xs,ys,type = type)
    READU,HH_unit,HH
    ;!!!修改影像读取的存储方式
    BYTEORDER,HH,/FTOXDR

    ;读取HV极化影像数据
    OPENR,HV_unit,Image_HV,/get_lun
    HV = MAKE_ARRAY(xs,ys,type = type)
    READU,HV_unit,HV
    BYTEORDER,HV,/FTOXDR

    ;打开掩膜文件的头文件
    OPENR,HH_Mask_unit,Image_HH_Mask,/get_lun
    HH_Mask = MAKE_ARRAY(xs,ys,type = type)
    READU,HH_Mask_unit,HH_Mask
    BYTEORDER,HH_Mask,/FTOXDR

    ;生成HH/HV波段数据
    HH_HV = MAKE_ARRAY(xs,ys,type = type)
    ;修改影像的存储方式
    BYTEORDER,HH_HV,/FTOXDR

    for i = 0,xs-1 DO BEGIN
      for j = 0,ys-1 DO BEGIN
        ;如果掩膜文件为非零值或者HH极化数据为零值(背景值),则将输出的文件设置为255
        IF HH_Mask[i,j] NE 0 OR HH[i,j] EQ 0 THEN BEGIN
          HH[i,j]    =  255
          HV[i,j]    =  255
          HH_HV[i,j] =  255
        ENDIF ELSE BEGIN
          HH[i,j]    = 10*ALOG10(HH[i,j])
          HV[i,j]    = 10*ALOG10(HV[i,j])
          HH_HV[i,j] = HH[i,j]/HV[i,j]
        ENDELSE
      endfor
    endfor
    FREE_LUN, HH_unit
    FREE_LUN, HV_unit
    FREE_LUN, HH_Mask_unit

   
    ;!!!!!将文件的存储方式进行修改
    BYTEORDER,HH,/XDRTOF
    BYTEORDER,HV,/XDRTOF
    BYTEORDER,HH_HV,/XDRTOF

    ;检查程序是否存在数学错误
    IF check_math() THEN Print, check_math()
    Beta0_HH_Img = header_path + 'Aim_Beta0_HH.img'
    OPENW,Beta0_HH_lun,Beta0_HH_Img,/get_lun
    ;生成HH极化转为dB值文件的的头文件信息
    WriteU,Beta0_HH_lun,HH
    Close,Beta0_HH_lun
    Free_LUN,Beta0_HH_lun

    Beta0_HV_Img = header_path + 'Aim_Beta0_HV.img'
    OPENW,Beta0_HV_lun,Beta0_HV_Img,/get_lun
    WriteU,Beta0_HV_lun,HV
    Close,Beta0_HV_lun
    Free_LUN,Beta0_HV_lun

    Beta0_HH_HV_Img = header_path + 'Aim_Beta0_HH_HV.img'
    OPENW,Beta0_HH_HV_lun,Beta0_HH_HV_Img,/get_lun
    WriteU,Beta0_HH_HV_lun,HH_HV
    Close,Beta0_HH_HV_lun
    Free_LUN,Beta0_HH_HV_lun

    ;HH、HV、HH_HV影像3个波段进行波段合成
    Aim_Beta0_HH_HV = [[HH],[HV],[HH_HV]]
    Aim_Beta0_HH_HV = Reform(Aim_Beta0_HH_HV,[3,xs,ys])
    Output_File = Output_Directory + 'Layer Stacking.img'
    OPENW,lun,Output_File,/get_lun
    WriteU,lun,Aim_Beta0_HH_HV
    Close,lun
    Free_Lun,lun

    ;输出显示处理状态
    Print,'还剩',strtrim(num-id-1,1),'景影像待处理,已处理',strtrim(id+1,1),'景影像'
  ENDfor
  print,'处理完毕'
END

2018年1月12日星期五

Batching Mosaic Images based on mask data and IDL(批量掩膜:基于IDL)

;+
; Author: Baikal
;-
; Time: Dec 15,2017
;
; To achieve the goal of batching Mask Land.
; Completed in Dec 19,2017 at 22:46.
;
Pro Batch_Mask_Land_02
  directory = 'G:\2016.06.MOD\MOD02\5Clip\201606\'
  files = file_search(directory,count = num,'*.tif')
  Print,'共有',strtrim(num,2),'景影像待掩膜'
  mask_file = 'G:\2016.06.MOD\MOD02\6Mask\Mask_01.tif'
  mask_data = READ_TIFF(mask_file)
  mask_data = reform(mask_data,[1, 1698, 1187])

  for i = 0,num-1 DO BEGIN
    MOD02 = READ_TIFF(files[i],GEOTIFF = geoinfo)
    ;将裁剪后的MOD02中存在的异常值转变为NaN值。
    MOD02 = (MOD02 GT 0 AND MOD02 LE 1)*MOD02 + (MOD02 GT 1 OR MOD02 LE 0)*250
    ;修改DN=250为NaN  b1*float(b1 ne 250)/(b1 ne 250)
    MOD02 = MOD02*float(MOD02 ne 250)/(MOD02 ne 250)
    Outpath = 'G:\2016.06.MOD\MOD02\7Sea\201606\'
    pos = strpos(files[i],'\',/reverse_search)
    Outname = strmid(files[i],pos+1,7) + '_Sea.tif'
    ;Multibands Layer Stacking
    ;通过[]实现多波段合成
    Mask = [Mask_data,Mask_data,Mask_data,Mask_data,Mask_data,Mask_data,Mask_data]
    Output_Data = MOD02 * Mask
    WRITE_TIFF,Outpath + Outname,Output_Data,/FLOAT,GEOTIFF = geoinfo
    Print,'第',strtrim(i+1,2),'景影像掩膜完毕'
  endfor
  Print,'掩膜完毕'
END

2018年1月11日星期四

Batching Mosaic Program (ENVI/IDL Secondary Development) (批量镶嵌:基于ENVI/IDL)

;+
; Author: Baikal
;-
; Time: Jan 11,2018
;
; Batching Mosaic based on ENVI/IDL.

PRO MOSAICbatch
  COMPILE_OPT IDL2
  ; Start the application
  e = ENVI()

  ; Select input scenes
  files = FILE_SEARCH('G:\2016.06.MOD\MOD35\5Clip\', '*.tif')
  Output_dir = 'G:\2016.06.MOD\MOD35\7Sea\201606\'
  ;将同一天待镶嵌的两幅影像移动至单独的文件夹
  MV_dir = Output_dir + '\Single_Day_Double\'

  scenes = !NULL
  FOR i=0, N_ELEMENTS(files)-1 DO BEGIN
    if i EQ 0 THEN void = READ_TIFF(files[i],GEOTIFF = geoinfo)
    if i NE N_ELEMENTS(files)-1 THEN BEGIN
;      FILE_MOVE,files[i],MV_dir
;      FILE_MOVE,files[i+1],MV_dir
      backslash_pos = strpos(files[i],'\',/reverse_search)
      file_date1 = strmid(files[i],backslash_pos + 1,7)
      file_date2 = strmid(files[i+1],backslash_pos + 1,7)
      if file_date1 EQ file_Date2 THEN BEGIN
        raster1 = e.OpenRaster(files[i])
        raster2 = e.OpenRaster(files[i+1])
        scenes = [raster1, raster2]

        ; Create the mosaic raster
        mosaicRaster = ENVIMosaicRaster(scenes , BACKGROUND = !VALUES.F_NAN )
        ; Save it as ENVI format
        newFile = e.GetTemporaryFilename()
        mosaicRaster.Export, newFile, 'ENVI'
        ; Open the mosaic file
        mosaicRaster = e.OpenRaster(newFile)
        ; Exportthe raster as a TIFF file.
        ; Change the directory as needed for your own system
        SubRaster = ENVISubsetRaster(mosaicRaster)        
        ; Display the result
        View = e.GetView()
        Layer = View.CreateLayer(mosaicRaster)
        View.Zoom, /FULL_EXTENT
        Outname = file_date1 + '_Cloud.tif'
        SubRaster.Export, Output_dir + Outname , 'TIFF'

        ; Close the dataset and remove it from the display
        raster1.Close
        raster2.Close
      endif
    endif
  ENDFOR 
  e.close
END

Reference:
http://www.harrisgeospatial.com/docs/ENVIMosaicRaster.html
http://www.harrisgeospatial.com/docs/programmingguideworkingwithrasters.html#VirtualRasterConsiderations


2017年12月28日星期四

常用快捷键(Matlab、Python 以及 IDL)

Matlab:

对齐:选中需要对齐的多行,然后Ctrl+I组合键进行多行对齐;
缩进:CTRL + [ 或者 CTRL + ]   向左缩进 或 向右缩进
注释/反注释:CTRL + R / CTRL + T
自动调整:
Ctrl+i 
自动调整缩进格式,比如有if……end,for……end语句但是没有缩进的话程序不太好看,可以使用此键,对多行有效的

切换窗口:
Ctrl+Tab 
可以在Command Window,Current Directory和Command history之间切换当前空间。

命令有关:
上下箭头寻找此前和后输入的命令,每次一条;或者是输入少量字母,那么显示出来最后一条以该字母为开头的命令
Esc
:删除当前行的全部内容
程序运行:
F12 
设置取消断点
F5 
运行


1.  Ctrl+C 中断正在执行的操作;
2. figure命令新建一个绘图窗口;
3. 注释掉一段程序:%{、%};
4. doc 命令名,打开命令的帮助文档;
5. clc清屏;
6. clear 和clear all
clear 变量名:可以清除workspace中的无用的变量,尤其是一些特别大的矩阵,不用时及时清理,可以减少内存占用。
clear all 
清除所有的变量,使workspace一无所有,当重新开始一次算法验证时,最好执行一次,让workspace中的变量一目了然。

7.close all
8.上下光标键↑↓
在命令窗口中,上下光标键可以将历史记录中的命令复制到输入位置,便于快速重新执行。如果输入命令的前几个字母如 [row, col] =,再使用光标键,则只会选择以这些字母开始的命令。
9.Tab补全
对名称记得不太清楚的命令,可以输入开头的几个字母,然后按Tab键,当只有一个以这些字母开头的命令时,将自动补全命令名,否则显示一个命令名列表,方便从中选择。当然,只在命令窗口中有效。
10.cell模式
在一个长长的脚本m文件中,可能需要对其中的一段反复修改,查看执行效果,这时,cell模式就非常有用了。cell模式相当于将其中的代码拷贝到命令窗口中运行。两个%后接一个空格(%% )开始一个cell。将输入光标放到一个cell中时,背景将变为浅黄色,Ctrl+Enter执行cell中的代码。
执行cell中代码时不需要保存m文件,该m文件可以不在路径列表中。
cell
模式中,断点不起作用,当然,调用的子程序中的断点还是正常的。
11.cell模式
在一个长长的脚本m文件中,可能需要对其中的一段反复修改,查看执行效果,这时,cell模式就非常有用了。cell模式相当于将其中的代码拷贝到命令窗口中运行。两个%后接一个空格(%% )开始一个cell。将输入光标放到一个cell中时,背景将变为浅黄色,Ctrl+Enter执行cell中的代码。
执行cell中代码时不需要保存m文件,该m文件可以不在路径列表中。
cell
模式中,断点不起作用,当然,调用的子程序中的断点还是正常的。

Python:

对齐:
注释/反注释:ALT + 3 / ALT + 4

Spyder:
  
        Ctrl + 1: 注释/反注释
  Ctrl + 4/5: 块注释/块反注释
  Ctrl + L: 跳转到行号
  Tab / Shift + Tab: 代码缩进/反缩进
  Ctrl +I:显示帮助

IDL:


对齐:CTRL + SHIFT + F
注释:Ctrl+;


Reference:
Matlab 快捷键参考:http://hyz301.iteye.com/blog/2089436 ;
Python 快捷键参考:http://blog.csdn.net/z1988316/article/details/7109047 ;
Spyder 快捷键参考:https://www.cnblogs.com/DaleSong/p/5289393.html 

2017年12月13日星期三

IDL调用插件中的函数(以IDL调用MCTK为例)

方法1:将扩展工具放在ENVI Classic安装路径(save_add)中,保证ENVI Classic能够正常使用此扩展工具。然后在IDL中启动ENVI Classic之后,便可以调用,如Fig. 1要求。
Fig. 1

方法2:在IDL代码中 restore, xxxxx.sav ,然后就可以调用这个sav文件中的接口了。

IDL调用MCTK实例:

;+
; Author: Baikal
;-
; Time: Nov 29,2017
;
Pro test_batch_modis_conversion_MOD02
  compile_opt idl2

  ;restore,'D:\Program Files\Exelis\ENVI53\classic\save_add\mctk.sav'
  ENVI,/restore_base_save_files
  ENVI_Batch_Init

  mod02_file = 'G:\2016.06.MOD\MOD02\1Source Data\201606\MYD02HKM.A2016153.1920.006.2016154155642.hdf'
  output_location = 'G:\2016.06.MOD\MOD02\2Layer Stacking\'
  output_rootname = '2016154155642'

  ;Output method schema is:
  ;0 = Standard, 1 = Projected, 2 = Standard and Projected
  out_method = 1

  ;Calibration method schema is:
  ;0 = Radiance / Emissivity, 1 = Reflectance / Emissivity, 2 = Radiance / Brightness Temp
  ;Set Projection
  output_projection =  ENVI_proj_create(/geographic)

  ;Calibration method schema is:
  ;0 = Radiance/Emissivity,1 = Reflectance/Emissivity,2 = Radiance/Brightness Temperature
  Calib_Method = 1

  ;Choosing linear interpolation
  interpolation_method = 0

  ;Note:Do not put the bridge creation/destruction code inside a loop
  bridges = mctk_create_bridges()
  convert_modis_data, in_file = mod02_file, $
    out_path = output_location, out_root = output_rootname, $
    out_method = out_method, $
    out_proj = output_projection, $
    Calib_Method = Calib_Method, $
    SD_POS = [0,1], $
    interp_method = interpolation_method, $
    bridges = bridges, $
    /progress
  mctk_destroy_bridges, bridges

end


参考链接:
我在ArcGIS知乎上的提问:http://zhihu.esrichina.com.cn/question/19143

2017年10月9日星期一

HDF文件、HDF5文件的读取(IDL)

HDF5数据的几个重要概念:
File(文件)、Group(组)、Dataset(数据集)三部分。常用的读取数据的过程是:文件读取、组的读取以及数据集的读取。
HDF文件常用的打开软件为HDF Explorer,如图1所示。
Fig.1
打开文件、组、数据集的函数分别是H5F、H5G、H5D这三种。
H5_list可以列出一个文件中的所有数据集,然后可以通过这些数据集的名称获取数据。


IDL读取HDF文件参考链接:
http://www.cnblogs.com/myyouthlife/archive/2012/03/10/2388885.html
http://www.cnblogs.com/alex-bn-lee/p/5812231.html
http://www.cnblogs.com/myyouthlife/archive/2012/03/10/2388885.html

IDL读取HDF5文件参考链接:
http://www.cnblogs.com/ahnucao/p/4938770.html



『转载』IDL二进制与十进制互相转化代码

;-----------------------二进制到十进制-----------------
;主程序
FUNCTION f_b2d,n
  ;By friendchj
  ;Base on GORDON NANA KWESI AMOAKO's MATLAB Program
  ;function f_b2d converts numbers with binary fractions
  ;or binary fractions only to decimalnumbers
  ;------------------------------------------------------
  ;INPUT: n, n is a String of Binary numbers e.g. f_b2d('11001.101') gives us
  ;OUTPUT: A Decimal Number
  ;SAMPLE input and output
  ;f_b2d('11001.101')=25.6250
  ;f_b2d('110000111.111111101')=391.9941
  ;f_b2d('0.11001111101')= 0.8110
  ;Converting the Number to String
  n=strtrim(n,2)
  numadd=0
  p=strlen(n)
  ;-------------------------------------------------------
  if strpos(n,'.') EQ -1 then begin
    y=bin2dec(n)
  endif else begin
    ;----------------------------------------------------------------------
    j=strpos(n,'.')
    i_part=strmid(n,0,j)
    f_part=strmid(n,j,p-j)
    for i=0,strlen(f_part)-1 do begin
      if strmid(f_part,i,1) EQ '1' then numadd=numadd+(0.5^i)
    endfor
    y=f_b2d(i_part)+numadd
    ;----------------------------------------------------------------------
  endelse
  return,y
end
;------------------------------------------------------------------------
;子程序
FUNCTION bin2dec,n
  ; By friendchj
  p=strlen(n)
  y=0L
  for i=0,p-1 do begin
    y=y+strmid(n,i,1)*2^(p-i-1)
  endfor
  return,y
  ;-------------------十进制到二进制的装换-----------------------------------------
  ;主程序
FUNCTION f_d2b,n
  ;-----------------------------------------------
  ;By friendchj
  ;Based on GORDON NANA KWESI AMOAKO's MATLAB Program
  ;function f_d2b converts numbers with fractions or
  ;fractions only to BINARY
  ;-----------------------------------------------
  ;INPUT: n e.g. 25.625
  ;OUTPUT: Binary number e.g. 11001.101
  ;Converting the Number to String

  ;将数字转化为字符串
  strn=num2str(n)
  p=strlen(strn)
  ;------------------------------------------------
  if strpos(strn,'.') EQ -1 then begin
    ;将整数数值转化为二进制
    y=d2b(n)
    return,y
  endif else begin
    ;------------------------------------------------
    k=strpos(strn,'.')

    ;Retrieving INTEGER and FRACTIONAL PARTS as strings
    i_part=strmid(strn,0,k)
    f_part=strmid(strn,k,p-k)

    ;Converting the strings back to numbers
    ni_part=long(i_part)
    nf_part=float(f_part)
    ni_part=d2b(ni_part)
    strtemp=''
    temp=nf_part
    ;-------------------------------------------------
    t='1'
    s='0'
    while nf_part GE 0 do begin
      nf_part=nf_part*2
      if (nf_part EQ 1) or (nf_part EQ temp) then begin
        strtemp=string(strtemp,t)
        strtemp=STRCOMPRESS(strtemp, /REMOVE_ALL)
        break
      endif else begin
        if nf_part GT 1 then begin
          strtemp=string(strtemp,t)
          strtemp=STRCOMPRESS(strtemp, /REMOVE_ALL)
          nf_part=nf_part-1
        endif else begin
          strtemp=string(strtemp,s)
          strtemp=STRCOMPRESS(strtemp, /REMOVE_ALL)
        endelse
      endelse
    endwhile
    if ni_part EQ 0 then begin
      y=string('0.',strtemp)
      y=STRCOMPRESS(y, /REMOVE_ALL)
      return,y
    endif else begin
      y=string(ni_part,'.',strtemp)
      y=STRCOMPRESS(y, /REMOVE_ALL)
      return,y
    endelse
    ;------------------------------------------------
  endelse
end
;----------------------------------------------------
;子程序
;+-------------------------------------------------------------------------------
;| converting float/double type numer into its original inputform
;| double type has appoximately 16 digits of significance. float has 7
;|
;| in : a : the data to convert
;|    : Keyword : tip: [1,0] : [output tps(E:D) or not]
;| out: Return, String of the data
;| Example:
;|        a = 4356245.1245D ; 注意要确定数据类型为Double! 如果是浮点型只能达到7位精度
;|    print, dbl2str(a) ;
;+-------------------------------------------------------------------------------
Function dbl2str, a
  Compile_Opt Strictarr
  tp=size(a,/type)
  if tp ne 4 and tp ne 5 then begin
    a=double(a)
    tp=5
  endif
  tps=tp eq 4?'E':'D'
  rawstr=strtrim(string(a,format='(g)'),2);full width G format
  pos = Strpos(rawstr, 'e', /REVERSE_SEARCH) ; 有e,不砍0
  if pos ne -1 then Return, rawstr
  ;
  ; 砍0
  no0 = 1
  while no0 do begin
    len = Strlen(rawstr)
    endstr = Strmid(rawstr, len-1, 1)
    if endstr ne '0' then no0 = 0 $
    else begin
      rawstr = Strmid(rawstr, 0, len-1)
    endelse
  endwhile
  ;
  ;
  Return, rawstr
End
;+-------------------------------------------------------------------------------
;| 将数值型转成字符串
;| 注意,不能处理数值数组、复数
;| 输入: 数值型变量
;| 输出: 对应的字符串
;| 示例:
;|      a = 4356245.1245D
;|      stra = NumToStr(a)
;| 作者: Huxz 2007-10
;+-------------------------------------------------------------------------------
Function Num2Str, num
  Compile_Opt Strictarr
  num = num[0]
  data_type = Size(num, /type)
  case data_type of
    1: Return, Strtrim(Fix(num), 2) ; Byte
    2: Return, Strtrim(num, 2); Int
    3: Return, Strtrim(num, 2); Long
    4: Return, Dbl2str(num); Float
    5: Return, Dbl2str(num); Double
    12: Return, Strtrim(num, 2); Unsigned Int
    13: Return, Strtrim(num, 2); Unsigned Long
    14: Return, Strtrim(num, 2); Long64
    15: Return, Strtrim(num, 2); Unsigned Long64
    else: Return, num
  endcase
End
;-----------------------------------------------------
;子程序
FUNCTION d2b,n
  strtemp=''
  if n lt 0 then begin
    print,' %f is not a valid number\n'
  endif else begin
    while n NE 0 do begin
      strtemp=string(string((n mod 2)),strtemp)
      strtemp=STRCOMPRESS(strtemp, /REMOVE_ALL)
      n=floor(n/2.0)
    endwhile
  endelse
  y=strtemp
  return,y
end

LibSVM Chinese Brief Infroduction

Reference: [1]  https://blog.csdn.net/v_july_v/article/details/7624837 [2]  https://wenku.baidu.com/view/c402e983336c1eb91b375d37.html?fr...

  • Word (2)