MATLAB:设计一个“热门开始”

时间:2011-01-12 01:54:18

标签: matlab

我目前正在MATLAB中编写一个函数,它有两个步骤:

  1. 它处理一些数据
  2. 对已处理数据进行一些计算
  3. 我正在使用该功能运行一系列实验,我在其中调整了步骤2中的计算方式。

    看到我如何使用大型数据集并且数据处理步骤每次都需要一段时间,但是,我想知道是否还有函数中的“热启动”代码。

    也就是说,无论如何都要保存我在步骤1之后所做的所有进度,这样如果我第二次或第三次运行该功能,它可以跳过步骤1)并直接进入步骤2 )?

    编辑:谢谢大家的建议。有多种方法可以做到这一点 - 我认为Kitsune的建议最适合我的情况。

4 个答案:

答案 0 :(得分:2)

function data = get_data(varargin)
persistant stored_data
if nargin>1 && any(strcmp(varargin,'--reload'))
  stored_data=[];
end
if isempty(stored_data)
  stored_data = ...;
end

return stored_data;

答案 1 :(得分:1)

这样做的一种方法是编写class而不是函数。下面定义了一个非常基本的类,您可以根据需要进行扩展。它要求您将函数中的两个步骤分解为两个函数,在我的示例中称为runFirstSteprunSecondStep

你将其作为

运行
obj = myAwesomeClass;
finalResults = obj.run(inputData); %# pass inputData for the first step if necessary

中间结果存储在obj.intermediateResults中,因此如果再次调用run,则会自动省略第一步。

如果需要,可以为属性intermediateResults添加set和get函数。无论何时写入函数,set函数都会将结果写入磁盘,并且get函数会在调用它时尝试加载中间结果(如果它们存在),并且属性为stil为空。

classdef myAwesomeClass<handle
properties
   intermediateResults
end 
methods
   function finalResults = run(obj,inputData)
        %# run accepts the object and runs both steps, if necessary
        %# inputData is the data that is processed (if it's not loaded inside runFirstStep)

        %# the first step only needs to run if there are no intermediate results
        if isempty(obj.intermediateResults)
           obj.intermediateResults = runFirstStep(inputData);
        end

        %# we always want to run the second step
        finalResults = runSecondStep(obj.intermediateResults);
    end
end
end

显然,你也可以在一个属性中保存finalResults,添加set / get方法并保存它,然后你可以添加一个plot方法,它可以生成很好的结果图。简而言之,该类允许您方便地收集与数据交互所需的所有功能。

答案 2 :(得分:1)

正如Jonas指出的那样,创建一个类可以是一个解决方案,但如果第2步是类的一部分(那么你希望能够修改类的方法),那么可能会有一些细微的细节。 / p>

另一个常见的解决方案是让函数执行第1步并返回一些数据结构或数组集合(适合您的情况)。如果需要,您可以将它们保存到磁盘。然后,将这些数据项传递给第2步功能。

答案 3 :(得分:1)

对于这类问题,我喜欢将这两个阶段分成两个独立的功能。一个生成数据,将其存储为结构的字段。然后我保存这个结构。如果需要,主脚本可以运行这两个部分。

function mystruct = gen_data( ... )
    mystruct.field = ...;
end

使用一次,执行此操作:

mystruct = gen_data( ... );
save(mystruct, 'mystruct.mat');

主处理函数将此结构作为其参数之一:

function result = process_data(mystruct, ...)
    % do stuff
end

我通常通过主脚本运行处理。我还将我的工作空间和保存的变量保存在版本控制中,并与我的代码和历史保持一致,因此我可以向后工作以获得特定结果。

if (~exist('mystruct'))
    load('mystruct.mat');
end
result = process_data(mystruct);