我目前正在MATLAB中编写一个函数,它有两个步骤:
我正在使用该功能运行一系列实验,我在其中调整了步骤2中的计算方式。
看到我如何使用大型数据集并且数据处理步骤每次都需要一段时间,但是,我想知道是否还有函数中的“热启动”代码。
也就是说,无论如何都要保存我在步骤1之后所做的所有进度,这样如果我第二次或第三次运行该功能,它可以跳过步骤1)并直接进入步骤2 )?
编辑:谢谢大家的建议。有多种方法可以做到这一点 - 我认为Kitsune的建议最适合我的情况。答案 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而不是函数。下面定义了一个非常基本的类,您可以根据需要进行扩展。它要求您将函数中的两个步骤分解为两个函数,在我的示例中称为runFirstStep
和runSecondStep
。
你将其作为
运行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);