旧神马系统在IDL和matlab中批量转移数据的脚本

在旧神马系统中,使用vpn登录可能导致巨大的操作延迟,而完全下载所有数据到本地又需要大量时间。可以使用IDL先将数据读取,然后将需要的数据保存为独立文件,再交由本地的其他软件处理。以下提供一组可以在任意版本IDL和MATLAB中转移数据的脚本,每次可以转移若干个向量或2维矩阵。

以下为IDL部分,将其保存为SaveForMatlab.pro


PRO SaveForMATLAB, filename, varlist, namelist
  OPENW, lun, filename, /GET_LUN
  
  ; 写入文件头
  PRINTF, lun, '#IDL2MATLAB'
  
  ; 处理每个变量
  FOR i = 0, N_ELEMENTS(varlist)-1 DO BEGIN
    var = varlist[i]
    varname = namelist[i]
    
    ; 写入变量名
    PRINTF, lun, 'VARIABLE:' + varname
    
    ; 判断变量类型(向量或矩阵)
    dims = SIZE(var, /DIMENSIONS)
    IF N_ELEMENTS(dims) EQ 1 THEN BEGIN
      PRINTF, lun, 'TYPE:VECTOR'
      PRINTF, lun, 'SIZE:' + STRTRIM(dims[0], 2)
      
      ; 写入向量数据
      FOR j = 0, dims[0]-1 DO BEGIN
        PRINTF, lun, STRTRIM(var[j], 2)
      ENDFOR
    ENDIF ELSE BEGIN
      PRINTF, lun, 'TYPE:MATRIX'
      PRINTF, lun, 'SIZE:' + STRTRIM(dims[0], 2) + ',' + STRTRIM(dims[1], 2)
      
      ; 写入矩阵数据
      FOR j = 0, dims[0]-1 DO BEGIN
        line = ''
        FOR k = 0, dims[1]-1 DO BEGIN
          line = line + STRTRIM(var[j, k], 2)
          IF k LT dims[1]-1 THEN line = line + ','
        ENDFOR
        PRINTF, lun, line
      ENDFOR
    ENDELSE
  ENDFOR
  
  FREE_LUN, lun
END

以下为matlab部分,将其保存为ReadFromIDL.m

function vars = ReadFromIDL(filename)
    fid = fopen(filename, 'r');
    if fid == -1
        error('无法打开文件');
    end
    
    vars = struct();
    currentVar = '';
    
    while ~feof(fid)
        line = fgetl(fid);
        
        if startsWith(line, '#')
            
            continue;
        end
        
        if startsWith(line, 'VARIABLE:')
            currentVar = strrep(line(10:end), ' ', '_');
            continue;
        end
        
        if startsWith(line, 'TYPE:')
            type = line(6:end);
            continue;
        end
        
        if startsWith(line, 'SIZE:')
            sizeStr = line(6:end);
            sizeParts = strsplit(sizeStr, ',');
            
            if strcmp(type, 'VECTOR')
                sizeVal = str2double(sizeParts{1});
                data = zeros(sizeVal, 1);
                
                for i = 1:sizeVal
                    data(i) = str2double(fgetl(fid));
                end
                
                vars.(currentVar) = data;
            elseif strcmp(type, 'MATRIX')
                rows = str2double(sizeParts{1});
                cols = str2double(sizeParts{2});
                data = zeros(rows, cols);
                
                for i = 1:rows
                    lineData = fgetl(fid);
                    parts = strsplit(lineData, ',');
                    for j = 1:cols
                        data(i,j) = str2double(parts{j});
                    end
                end
                
                vars.(currentVar) = data;
            end
        end
    end
    
    fclose(fid);
end
文章链接:https://sunwaybits.tech/%e6%97%a7%e7%a5%9e%e9%a9%ac%e7%b3%bb%e7%bb%9f%e5%9c%a8idl%e5%92%8cmatlab%e4%b8%ad%e6%89%b9%e9%87%8f%e8%bd%ac%e7%a7%bb%e6%95%b0%e6%8d%ae%e7%9a%84%e8%84%9a%e6%9c%ac/
文章标题:旧神马系统在IDL和matlab中批量转移数据的脚本
文章作者:Yu, Yangdi
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇