MATLAB中存储中间数据以避免重复计算

来源:互联网 发布:淘宝店铺为什么没访客 编辑:程序博客网 时间:2024/05/22 06:08

在做一个研究的初期一般都用matlab来试一试水,毕竟matlab开发算法原型还是比较快的,至少在图形领域是这样的,总之实验室学长都是这样做的。

然而图形领域一个比较头疼的问题就是运算时间。尤其是用了各种机器学习算法之后,数据量大,计算时间就特别长了。

而研究过程中常常需要各种测试,看效果,然后修改,这是常见的流程。此时问题产生了。刚开始的时候也许代码不多,运算时间也不长,不会有什么问题,然而代码长度不断增加,运算时间不断加成,每次测试将会消耗大量的时间重复改动部分之前的运算,然后才执行真正改动过的运算。这就造成了大量的浪费。

之前也尝试过不同的办法,比如每次保存workspace, 然后只需检测变量是否存在就行,如果存在就不再运算。但是时间一长容易混乱。后来试过将变量存成文件,然后检测文件是否存在,存在就读,然而也不太方便。

后来写了两个小函数,原理还是检测文件,存在就避免重复计算。只是这样显得方便快捷一些,并且稍稍封装一些有利于管理和使用。同样有利于修改,毕竟到每个载入文件的地方都修改源代码是件比较麻烦的事情,相比之下,仅仅修改接口实现就方便得多。

主要用到三个函数,用于生成对应变量的名字,存变量和读取变量。

util_varname.m

function [ fname ] = util_varname( varname )% this function will generate a file name for a variable% The file name should be name of var and a prefixfname = sprintf('preData/data_%s.mat',varname);end

util_save.m

function  util_save( var,name )%UTIL_SAVE Summary of this function goes here%   Detailed explanation goes heres = struct;s = setfield(s, name,var);save(util_varname(name),'-struct', 's');end

util_load.m

function [ ret,succ ] = util_load( varname )% this util function will load a variable% from file, set succ if success% the two function, util_save and util_laod should% be used together    if(exist(util_varname(varname),'file'))        ret = load(util_varname(varname) , varname);        ret = struct2cell(ret);        ret = ret{1};        succ = true;    else        ret = [];        succ = false;    endend

这样,需要避免重复计算的变量可以这样得到,加入需要计算的是 val, 那么代码可以这样

[val ,succ] = util_load('val');if(succ == false)    % add code to calculate val here ...    % save val   util_save(fern,'fern');end

只需稍稍修改原来的代码就可以在下次修改的时候避免重复运算。这样可以节省很多很多的时间。当改动之前的运算需要运行数分钟时,存储数据的确时很必须的。

当需要重新计算的时候也很方便,删掉已有的数据文件, 然后重新运行就可以了,不过为了保持数据之间的一致性,还必须同时删掉依赖于被重新计算的变量的变量对应的数据文件。这个问题暂时还没有解决。

1 0