Performance 如果由于某种原因必须停止迭代,那么在Matlab中保存结果的有效方法是什么?

Performance 如果由于某种原因必须停止迭代,那么在Matlab中保存结果的有效方法是什么?,performance,matlab,save,Performance,Matlab,Save,我试图通过运行迭代来最小化我的目标函数,这可能需要很长时间(可能需要一天或更长时间)。如果出于某种原因我不得不停止程序或程序挂起,那么什么是保存迭代结果的有效方法,这些迭代可能会一直运行到程序出于某种原因停止为止 我想保存的变量是:best\u obj\u fun和k\u to\u扰动\u best 注意:我正在矩阵中存储我的best\u obj\u fun,我只想要上次迭代时k\u to\u扰动\u best的值 请参阅以下代码中的最后一个循环,了解当程序以某种方式停止(例如CTRL+C)时我

我试图通过运行迭代来最小化我的目标函数,这可能需要很长时间(可能需要一天或更长时间)。如果出于某种原因我不得不停止程序或程序挂起,那么什么是保存迭代结果的有效方法,这些迭代可能会一直运行到程序出于某种原因停止为止

我想保存的变量是:
best\u obj\u fun
k\u to\u扰动\u best

注意:我正在矩阵中存储我的
best\u obj\u fun
,我只想要上次迭代时
k\u to\u扰动\u best的值

请参阅以下代码中的最后一个循环,了解当程序以某种方式停止(例如CTRL+C)时我想要的变量:

%%运行迭代以查找最小目标函数值
接受_iter=1;
对于iter=1:100
%#在网格上选择“nRandomPoints”随机点,从“fixed_Understanding_distribution”中采样
nRandomPoints=100;
随机网格点=randi(sqrt(nCell),[nRandomPoints,2]);%两列分别带有x和y坐标。
重复的坐标集合=ismember(随机网格点,固定网格坐标,'rows');%找到重复的坐标集
而任何(重复的集合)
随机网格点(坐标的重复集:)=randi(sqrt(nCell),[坐标的重复集之和,2]);%创建一组新的坐标
重复的坐标集合=成员(随机的网格点(。。。
重复的集合坐标,:),固定的网格坐标,'行';%#检查新的坐标
结束
扰动的线性指数=sub2ind([sqrt(nCell),sqrt(nCell)],随机网格点(:,1),。。。
随机网格点(:,2));%得到一个线性指数到矩阵被扰动
k_至_扰动_退火_初始=k_sisim_用于_退火;
k~u扰动退火初始值(扰动的线性指数)=emprand(k~u 20~u样本数据sisim,nRandomPoints,1);
%#扰动perm值的目标函数值计算
[new_obj_fun,new_k_geomean]=用于吉布斯采样的obj_fun(k_到扰动退火初始,x_200x200_gslib_格式向量…)。。。
,y_200x200_gslib_格式_向量,伽马基础,平均伽马基础,k效率WT);
如果新对象乐趣<最佳对象乐趣(接受iter)
最佳工作乐趣(接受iter+1)=新工作乐趣;
k到扰动退火最佳=k到扰动退火初始值;
最佳几何平均=新几何平均;
接受iter=接受iter+1;
结束
结束

您可以尝试在循环中使用
保存
-append
选项

假设在循环开始之前已初始化变量,则可以在循环开始之前创建一个文件,并每次更新它。这里有一个例子

A=zeros(...);%# this is an example of your variables that are initialized before the loop
save('filename','A');%# this creates a .mat file with the initialized variables

%#begin loop
for i=...
    ...
    ... %# some computations here

    save('filename','A','-append') %# this just replaces the variables in the .mat file with their current values
end
%# end loop
您必须将整个变量保存到文件中,也就是说,您不能这样做

save('filename','A(i)','-append')

您也可以在每一次
n
th迭代(而不是每次迭代)执行此操作。如果您处理的是非常大的数据集,并且一次只更改一个元素,那么我建议您只在每次
n
迭代中执行此操作,或者更好,编写您自己的二进制文件。

如果您在不关闭matlab的情况下停止迭代,那么一个简单的方法就是在for循环中使用函数。它允许您为工作区中的变量指定一个值,这意味着在您停止迭代后变量将在那里。

@yoda:我知道
save
命令,但是我不太愿意在循环中使用它,因为它会进一步增加我的迭代时间。此外,我将我的
best\u obj\u fun
存储在矩阵中,我只想要上次迭代时
k\u to\u扰动\u best
的值。您处理的矩阵大小是多少?虽然每次迭代时的保存都会对速度产生影响,但只有在较大的数组大小时才会明显。在我的机器上,保存
100x100
矩阵平均需要
0.002
秒。你也可以将保存命令移到<代码> KytoTyBuffyRealAlgIn <最佳> <代码>外,因为你只对最后一次迭代的值感兴趣。尤达:我可以移动到循环之外,但这是我在迭代过程中停止程序的要点。如果代码在两者之间停止,那么如果我将其保存在循环之外,它将不会达到
k\u to\u扰动\u退火\u最佳
。顺便说一句,
k_-to-u-permission\u-best
200x200
矩阵。对不起,我假设每个循环只需要
best-obj\u-fun
,当循环完全完成时,您只关心
k_-to-u-permission…
。因此,在我的机器上,一个
200x200
矩阵平均需要0.004秒来节省。问题是,这种差异是否明显?也许您可以尝试使用探查器查看
save
命令在代码中占用的时间。另一个选项是,如果您正在中断
Ctrl-C
,然后返回到MATLAB工作区(即代码不挂起,您不必重新启动),我建议您只保存它。为了节省一些输入,您可以使用(使用%%)分隔两个代码块,并首先在迭代中运行代码单元,当您中断时,运行下一个单元,即save命令。这样,您就不会不必要地保存每个步骤,并且仍然可以保存上一次迭代的结果。
save('filename','A(i)','-append')