MATLAB中persistent变量相当于C中局部静态变量,只能在所定义的函数内部访问到,并且一旦定义一直存在。

一般的解决方案

clear var 变量名

新的问题

如下图所示,本来想着将算法每次迭代的结果先暂时存放在一个persistent变量中,最后一次运行时将数据写入到文件中。后来调试发现,即使是利用clear var命令,该变量再次被初始化的时候仍然会被初始化为上次写入的结果。

function [ ] = RecordResult( Global )%检查静态变量是否存在,若存在且是第一次运行,则清除if Global.evaluated <= Global.Nclear var global_result;%第一次运行时,清除上次该函数运行留下的persistent变量endpersistent global_result;%% 判断目录是否存在method = func2str(Global.algorithm);question = func2str(Global.problem);dir_1 = sprintf('Data/%s/',question);                               %问题对应的第一级目录dir_2 = sprintf('%s%d/',dir_1,Global.run);                       %问题对应的第二级目录,单次运行结果存放在一个文件夹里面,文件夹的名称为运行序号%判断路径是否存在    if ~exist(dir_1,'dir')mkdir(dir_1);endif ~exist(dir_2,'dir')mkdir(dir_2);end%% 输出运行过程中的信息clc;%清空命令行fprintf('run %d\n',Global.run);fprintf('%s with %s on %s\n',method,func2str(Global.operator),question);fprintf('N: %d     evaluation: %d\n',Global.N,Global.evaluation);fprintf('status: (%6.2f%%), %.2fs passed...\n',Global.evaluated/Global.evaluation*100,Global.runtime);[r,~] = size(Global.result);result = {Global.result{r,:}};                                           %每个算法最后一次运行结果global_result = [global_result;result];%% 运行完毕后,保存实验结果到本地if Global.evaluated >= Global.evaluationfilename = sprintf('%s%s.mat',dir_1,question);              %存放汇总的运行结果(近似PF)filename2 = sprintf('%s%s.mat',dir_2,method);              %存放每个算法的所有运行结果if exist(filename2,'file')delete(filename2);endsave(filename2,'global_result');global_result = [];        %清除函数内部静态变量if exist(filename,'file')PF = load(filename);PF = CombineArchive(result{1,2},PF.PF,500);       %设置储备集中元素的个数elsePF = CombineArchive(result{1,2},[],500);     %个体组成的PFendfprintf('\nnumber of Non-dominant Solutions :%d\n',size(PF.objs,1));save(filename,'PF');        %保存结果end
end

原因分析:本来在RecordResult函数中有一个if判断,用来判断算法是否是最后一次迭代,若是,就会将该函数内部的persistent变量global_result设置为空。然而,由于自己中途中断了整个算法的运行,导致RecordResult函数中的persistent变量global_result没有被置为空。当再次运行整个程序时,第一次进入RecordResult函数时,虽然还是会执行如下面代码来清除上次实验保留的persistent变量。

if Global.evaluated <= Global.Nclear var global_result;%仍然会恢复上次的global_result的值
end

然而,当执行完persistent global_result后,系统仍然会恢复上次中断程序执行时保留的persistent变量global_result的值,即原内存空间部分的值,该内存区域的值好像只能在关闭matlab才能彻底释放内存。

新的解决方案

为了使得程序不会受到上次没有运行完的结果的影响,在该函数的开头,判断该程序是否为第一次执行,若是,则直接清空该persistent变量中的值。

function [ ] = RecordResult( Global )persistent global_result;% 声明静态变量    if Global.evaluated <= Global.Nglobal_result = [];%第一次运行时,清除上次该函数运行留下的persistent变量end%% 判断目录是否存在method = func2str(Global.algorithm);question = func2str(Global.problem);dir_1 = sprintf('Data/%s/',question);                               %问题对应的第一级目录dir_2 = sprintf('%s%d/',dir_1,Global.run);                       %问题对应的第二级目录,单次运行结果存放在一个文件夹里面,文件夹的名称为运行序号%判断路径是否存在    if ~exist(dir_1,'dir')mkdir(dir_1);endif ~exist(dir_2,'dir')mkdir(dir_2);end%% 输出运行过程中的信息clc;%清空命令行fprintf('run %d\n',Global.run);fprintf('%s with %s on %s\n',method,func2str(Global.operator),question);fprintf('N: %d     evaluation: %d\n',Global.N,Global.evaluation);fprintf('status: (%6.2f%%), %.2fs passed...\n',Global.evaluated/Global.evaluation*100,Global.runtime);[r,~] = size(Global.result);result = {Global.result{r,:}};                                           %每个算法最后一次运行结果global_result = [global_result;result];%% 运行完毕后,保存实验结果到本地if Global.evaluated >= Global.evaluationfilename = sprintf('%s%s.mat',dir_1,question);              %存放汇总的运行结果(近似PF)filename2 = sprintf('%s%s.mat',dir_2,method);              %存放每个算法的所有运行结果if exist(filename2,'file')delete(filename2);endsave(filename2,'global_result');if exist(filename,'file')PF = load(filename);PF = CombineArchive(result{1,2},PF.PF,500);       %设置储备集中元素的个数elsePF = CombineArchive(result{1,2},[],500);     %个体组成的PFendfprintf('\nnumber of Non-dominant Solutions :%d\n',size(PF.objs,1));save(filename,'PF');        %保存结果end
end

因此,每次实验开始前切记使用global_result=[];将persistent变量设置为空。

if Global.evaluated <= Global.Nglobal_result = [];%第一次运行时,清除上次该函数运行留下的persistent变量
end

这样一来,只需要在开始的时候检测该函数是否为第一次执行,若是,则将该persistent变量设置为空,也就不需要每次结束之后都将该persistent变量设置为空了。

即便是中途中断程序的运行,当函数重新运行时,第一次执行仍然会将结果设置为空,问题就解决了。代码来自改进的PlatEMO

【Matlab】彻底清除persistent变量相关推荐

  1. Matlab中的persistent变量

    Matlab中的persistent变量 persistent, 用于定义persistent变量.persistent变量对于声明它的函数来说是局部的,但是当退出该函数时,该变量仍然保存在内存中,数 ...

  2. matlab静态变量怎样分配内存,matlab中的静态变量

    persistent X Y Z 将X,Y,Z定义为在其声明处的函数的局部变量.然而,这些变量的值在函数调用期间在内存中保存(应该是堆区).Persistent 变量和global(全局)变量相似,因 ...

  3. Matlab:成功解决引用了已清除的变量 handles

    Matlab:成功解决引用了已清除的变量 handles 目录 解决问题 解决方法 这个破问题耽误了我半个多小时,what fuck!!气死laozi了 哈哈,还好,完美解决! 解决问题 解决引用了已 ...

  4. matlab工作区保留或者清除部分变量

    清除全部变量 clear all 清除部分变量 clear a 保留部分变量 clearvars -except a 猜你喜欢:

  5. matlab学习-结构体变量

    matlab结构体学习 matlab结构体学习 matlab结构体与C语言数据结构结构体或java语言类的定义有异曲同工之妙,其主要知识点如下 提示:写完文章后,目录可以自动生成,如何生成可参考右边的 ...

  6. matlab中清除command window的命令是什么?

    clf 清除图形窗 clc 清除指令窗中显示内容 clear 清除matlab工作空间中保存的变量 clear all 清除所有变量

  7. Matlab常用清除命令:clc、clear、clear all、clf、close、close all

    Matlab常用清除命令总结: clc命令:清空命令窗口中的内容. clear命令:清空workspace(工作空间)中的所有变量. clear all:清除工作空间的所有变量,函数,和MEX文件. ...

  8. MATLAB基础应用精讲-【基础知识篇】MATLAB表达式中的变量和关键字

    MATLAB变量命名规则 1.严格规定的变量名的格式 1.MATLAB 变量名必须以字母开头 2.可以使用的字符为字母,下划线和数字 3.长度不能过大,31个字符是最大长度. 4.字符是区分大小写的. ...

  9. Matlab:清除表中的杂乱数据和缺失数据

    Matlab:清除表中的杂乱数据和缺失数据 加载样本数据 汇总表 查找具有缺失值的行 替换缺失值指示符 删除具有缺失值的行 组织数据 此示例演示了如何查找.清除和删除具有缺失数据的行. 加载样本数据 ...

最新文章

  1. openssl生成https证书
  2. 编写c语言程序 斐波那契,C语言程序实现斐波那契数列的解题思路???
  3. Delphi Access violations 问题的解决之道
  4. ASP.NET 实现站内信功能(点对点发送,管理员群发)
  5. 计算机维修工国家职业标准,计算机维修工国家职业标准.pdf
  6. 《深度学习》图像超分初识
  7. testflight无法联网怎么办_互联网人最怕的,就是这一刻
  8. 表格数据快速转换成SQL语句
  9. 一句代码搞定权限请求,从未如此简单
  10. Windows 8实用窍门系列:11.Windows 8 中的Toast Tile Badge通知
  11. Win8.1部署 .NET Framework 3.5 安装方式汇总
  12. knx智能照明控制系统电路图_智能照明控制系统(KNX)教材
  13. python查看函数源代码
  14. matlab经验正交eof,经验正交函数分解(EOF).pdf
  15. 信鸽 ios tag推送 php,信鸽推送平台常见问题汇总iOS端
  16. 最新版IDEA Lombok插件安装
  17. 下载书籍的网址【汇总】
  18. Android陀螺仪加速度传感器
  19. MOOC创新创业学第七章单元测试题及答案
  20. HTML+CSS学习打卡第一周

热门文章

  1. ofo小黄车仍在自动续费!如何关闭微信自动扣费?
  2. java打印数组的连续非空子集_Apriori算法求数组的非空子集java代码
  3. 为什么阿里巴巴禁止使用 Executors 创建线程池,而是通过 ThreadPoolExecutor 方式?...
  4. Unit3D打包android时出错 CommandInvokationFailure: Unable to list target platforms. Please make sure the a
  5. 【转】SD Card - UHS-I UHS Speed Class 1
  6. C51单片机实现呼吸灯
  7. 嵌入式linux之yocto(三)qemu
  8. Java SE Day-10
  9. 网页游戏制作html5,利用HTML5 Canvas制作一个简单的打飞机游戏
  10. 怎么抠图最简单?教你一行Python代码去除照片背景