如何将持久变量保存到 .mat 文件中?
How to save persistent variable into .mat file?
我有一个在调用之间具有内部状态的设备模型。
以前我在函数调用中传递了该状态,并在退出函数时返回了一个新状态。
然后,我发现了持久变量,这正是我所需要的。但问题是当我需要在多个调用之间调试模型或设计时,很难重现我需要的确切调用。
例如,我有函数 foo:
function [y] = foo(x)
persistent k;
if isempty(k)
k = 0;
end
y = k*x;
k = k+1; %% or even k = rand
end
我有多个 运行:
x = 1:5;
for i = 1:5
y = foo(x(i))
end
第 4 次调用出错。目前我需要 运行 前三个调用来获取第 4 次调用的实际函数状态(如果 k 等于 rand,我将根本无法达到该状态)。
我试图在调用之间保存工作区以选择加载所有状态,但这不起作用:
for i = 1:3
y = foo(x(i))
end
save foo3.mat
for i = 4:5
y = foo(x(i))
end
clear all
load foo3.mat
foo(3)
ans =
0
那么如何保存该功能状态?
实际上,我可以在函数为 运行 时通过将 save 语句放在函数代码中来保存该变量,但对我来说这似乎不对。我认为该语句应该在顶部脚本中。
几个选项:
清除
不要使用 'clear all'。你很少需要做 clear all
,一个简单的 clear
通常就足够了。
mlock
输入 mlock in your function, note this has other implications which you should understand by looking at the documentation. Primarily you have to unlock (munlock) 来编辑函数文件。
请注意,这只会为 matlab 会话保留您的持久变量。
function [y] = foo(x)
persistent k;
mlock;
if isempty(k)
k = 0;
end
y = k*x;
k = k+1; %% or even k = rand
end
我想我的问题最合适的解决方案是用全局变量替换持久变量。在那种情况下,我对原始代码的改动最少:
function [y] = foo(x)
global k;
if isempty(k)
k = 0;
end
y = k*x;
k = k+1; %% or even k = rand
end
并像这样调试:
x = 1:5;
for i = 1:3
y = foo(x(i))
end
global k;
save("foo3.mat","k")
clear all
load foo3.mat
foo(4)
我找到的最佳解决方案是创建基于 class 的模型并将存储状态的变量移动到 class 属性 中。我可以像保存任何其他变量一样保存 class-object,因此我可以保存模型的任何中间状态:
classdef foo < handle
properties(Access = private)
k;
end
methods
function self = foo()
self.k = 0;
end
function [y] = bar(self, x)
y = self.k*x;
self.k = self.k+1; %% or even k = rand
end
end
end
并像这样调试:
f = foo();
x = 1:5;
for i = 1:3
y = f.bar(x(i))
end
save bar3.mat
for i = 4:5
y = f.bar(x(i))
end
clear f
load bar3.mat
f.bar(4)
在那种情况下,我不需要传递 return 状态,我可以加载任何中间状态。
我有一个在调用之间具有内部状态的设备模型。
以前我在函数调用中传递了该状态,并在退出函数时返回了一个新状态。
然后,我发现了持久变量,这正是我所需要的。但问题是当我需要在多个调用之间调试模型或设计时,很难重现我需要的确切调用。
例如,我有函数 foo:
function [y] = foo(x)
persistent k;
if isempty(k)
k = 0;
end
y = k*x;
k = k+1; %% or even k = rand
end
我有多个 运行:
x = 1:5;
for i = 1:5
y = foo(x(i))
end
第 4 次调用出错。目前我需要 运行 前三个调用来获取第 4 次调用的实际函数状态(如果 k 等于 rand,我将根本无法达到该状态)。 我试图在调用之间保存工作区以选择加载所有状态,但这不起作用:
for i = 1:3
y = foo(x(i))
end
save foo3.mat
for i = 4:5
y = foo(x(i))
end
clear all
load foo3.mat
foo(3)
ans =
0
那么如何保存该功能状态? 实际上,我可以在函数为 运行 时通过将 save 语句放在函数代码中来保存该变量,但对我来说这似乎不对。我认为该语句应该在顶部脚本中。
几个选项:
清除
不要使用 'clear all'。你很少需要做 clear all
,一个简单的 clear
通常就足够了。
mlock 输入 mlock in your function, note this has other implications which you should understand by looking at the documentation. Primarily you have to unlock (munlock) 来编辑函数文件。
请注意,这只会为 matlab 会话保留您的持久变量。
function [y] = foo(x)
persistent k;
mlock;
if isempty(k)
k = 0;
end
y = k*x;
k = k+1; %% or even k = rand
end
我想我的问题最合适的解决方案是用全局变量替换持久变量。在那种情况下,我对原始代码的改动最少:
function [y] = foo(x)
global k;
if isempty(k)
k = 0;
end
y = k*x;
k = k+1; %% or even k = rand
end
并像这样调试:
x = 1:5;
for i = 1:3
y = foo(x(i))
end
global k;
save("foo3.mat","k")
clear all
load foo3.mat
foo(4)
我找到的最佳解决方案是创建基于 class 的模型并将存储状态的变量移动到 class 属性 中。我可以像保存任何其他变量一样保存 class-object,因此我可以保存模型的任何中间状态:
classdef foo < handle
properties(Access = private)
k;
end
methods
function self = foo()
self.k = 0;
end
function [y] = bar(self, x)
y = self.k*x;
self.k = self.k+1; %% or even k = rand
end
end
end
并像这样调试:
f = foo();
x = 1:5;
for i = 1:3
y = f.bar(x(i))
end
save bar3.mat
for i = 4:5
y = f.bar(x(i))
end
clear f
load bar3.mat
f.bar(4)
在那种情况下,我不需要传递 return 状态,我可以加载任何中间状态。