在旧神马系统中,使用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
