您的位置:首页 > 编程语言 > MATLAB

Matlab | 算法运行过程中间项的文件存储与读取

2016-07-11 21:47 706 查看
       因为最近算法实现过程中,随着算法变得复杂,运行中不必要部分耗时逐渐增加。通常来说,为了节约调试时间,会把已经运行正确的结果存储下来(指定文件夹),然后再运行程序时便可以直接读取中间项本地文件,大大节约不必要的重复计算时间。这里只对我最近比较常用的存储文件和读取的方法进行介绍,当然欢迎大家一起讨论新的方法。
 
       首先,要弄清转储和读取的算法流程。
(1)加载本地指定文件名filename的文件file;
(2)如果加载失败(file为空),则跳转(3)否则跳转(4);
(3)计算生成指定file,并转储到本地指定路径filename;
(4)进入算法的下一步。
      Matlab大致代码如下:
% Load file (or compute if fileis not found)
    file = loadFile( options, shot );
    if( isempty( file ) )
        file = computeFile( options, shot );
    end
   其中loadFile函数的传参options记录存储路径和方法,shot记录当前处理文件的id,可用于处理多个同类计算问题的中间项存储。computeFile函数的传参同loadFile。
   loadFile函数具体代码如下。其中比较技巧性的地方在于fullfile函数的使用,根据传参则可找到指定文件夹outfolder,子文件夹名为file,计算方法命名子子文件夹,最后找到当前文件。
function result = loadFile(options, range )
    % file是文件的完全路径,options.outfolder是输出数据文件的文件夹路径,字符串格式;
    % options.method是当前部分的算法名称,字符串格式;
    % fileShot%i.mat是中间项的文件名
    file = fullfile( options.outfolder, 'file',...
            options.method, sprintf('fileShot%i.mat', range ) );
   
    % 如果本地文件已存在,则直接加载load,没有则返回为空
    if( exist( file, 'file' ) )
        flow = load( file );
        if( isfield( flow, 'input' ) )
            result = flow.input;
        elseif( isfield( flow, 'flow' ) )
            result = flow.flow;
        else
            warning( '%s: no known fieldfound\n', file );
            result = [];
        end
    else
        warning( '%s not found\n', file );
        result = [];
    end
 
end

    运行了loadFile函数之后,如果file还为空则说明本地不包含该中间项文件,则调用computeFile函数进行计算。
function file = computeFile(options, shot )
    filefolder = fullfile( options.outfolder, 'file',...
        options.method );
    if( ~exist(filefolder, 'dir' ) )
        mkdir( filefolder );
    end
 
   filename = fullfile( filefolder,...
        sprintf( 'fileShot%i.mat', shot ) );
       

if( strcmp( options.filemethod, '自己的计算方法' ) )
        file = computeFileMethod( ); % 自己的计算方法
    else
        error( 'Unknown file computationmethod' )
    end
    % 得到计算结果之后,保存在指定文件夹
    save( filename, 'file', '-v7.3' );
   

end
 
    以上就是比较耗时的算法过程中,对中间项进行文件存储并且读取的大致方法,最近用的很频繁的一段代码,也是从别处借鉴总结过来的,希望能给大家一些帮助!
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: