Matlab 如何将持久变量保存到.mat文件中?

Matlab 如何将持久变量保存到.mat文件中?,matlab,persistent,Matlab,Persistent,我有一个在通话之间具有内部状态的设备型号。 之前,我在函数调用中传递了该状态,并在退出函数时返回了一个新状态。 然后,我发现了持久变量,这正是我所需要的。但问题是,当我需要在多个调用之间调试模型或设计时,很难重现我需要的确切调用。 例如,我有函数foo: 函数[y]=foo(x) 宿存钾; 如果为空(k) k=0; 结束 y=k*x; k=k+1;%%甚至k=rand 结束 我有多次跑步: x=1:5; 对于i=1:5 y=foo(x(i)) 结束 在第四次通话中出错。目前,我需要运行前三个

我有一个在通话之间具有内部状态的设备型号。
之前,我在函数调用中传递了该状态,并在退出函数时返回了一个新状态。
然后,我发现了持久变量,这正是我所需要的。但问题是,当我需要在多个调用之间调试模型或设计时,很难重现我需要的确切调用。
例如,我有函数foo:

函数[y]=foo(x)
宿存钾;
如果为空(k)
k=0;
结束
y=k*x;
k=k+1;%%甚至k=rand
结束
我有多次跑步:

x=1:5;
对于i=1:5
y=foo(x(i))
结束
在第四次通话中出错。目前,我需要运行前三个调用以获得第四个调用的实际函数状态(如果k等于rand,我将根本无法达到该状态)。 我试图在两次调用之间保存工作区,以便可以选择加载所有状态,但这不起作用:

i=1:3时的

y=foo(x(i))
结束
保存foo3.mat
因为i=4:5
y=foo(x(i))
结束
清除所有
加载foo3.mat
傅(3)
ans=

 0
那么如何保存该函数状态呢? 实际上,在函数运行时,我可以通过在函数的代码中放入save语句来保存该变量,但对我来说,这似乎是不对的。我认为这句话应该放在最上面。

有几个选项:

清除 不要使用“全部清除”。如果您很少需要执行
清除所有
,那么简单的
清除
通常就足够了

mlock 在您的函数中,请注意,这还有其他含义,您应该通过查看文档来理解这些含义。首先,您必须解锁()它才能编辑函数文件

注意,这将仅在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

我想对我的问题最合适的解决方案是用全局变量替换持久变量。在这种情况下,我对原始代码的更改最少:

函数[y]=foo(x)
全球k;
如果为空(k)
k=0;
结束
y=k*x;
k=k+1;%%甚至k=rand
结束
和调试,如:

x=1:5;
对于i=1:3
y=foo(x(i))
结束
全球k;
保存(“foo3.mat”、“k”)
清除所有
加载foo3.mat
傅(4)
我找到的最佳解决方案是创建基于类的模型,并将存储状态的变量移动到类属性中。我可以像保存任何其他变量一样保存类对象,以便保存模型的任何中间状态:

classdef foo
和调试类似:

f=foo();
x=1:5;
对于i=1:3
y=f.bar(x(i))
结束
保存bar3.mat
因为i=4:5
y=f.bar(x(i))
结束
清除f
加载bar3.mat
f、 酒吧(4)

在这种情况下,我不需要传递和返回状态,我可以加载任何中间状态。

需要全部清除才能完全清除工作区,包括所有函数的持久变量。当然,我可以使用
clear foo
。在这种情况下使用
mlock
,因为
clear all
不会清除任何被锁定的函数。实际上,我不知道mlock如何帮助解决我的问题。当我需要得到中间状态时,它将保持最后一个状态。目前,我考虑编写一个基于类的模型,并在调用之间保存类对象。我保存了示例中的最后一个状态,只是为了说明
save
fun对保存持久变量没有帮助,而且exmaple比在调用之间使用save语句的拆分模型更简单。我解释了您的问题(可能是错误的)因为您正在使用
清除所有
清除持久变量。如果您需要查询中间值,您需要将它们存储在某个位置-可能会将它们输出到数组?是否可以将
持久
变量替换为传递给函数返回的变量?
[y,k]=foo(x,k)
是的,这是我以前做的。我可以使用这个方法,因为我很好奇,在我的情况下我可以使用持久变量,因为它们在我需要调试之前工作得很好。对于调试,如果你使用
dbstop if error
你可能会得到函数的状态,包括持久变量,对吗?无论如何,对我来说(但是我对您的用例了解不多)听起来有点奇怪,您想要一个持久变量(即,使用function隐藏状态),但您想要保存状态(从外部访问该状态)我所说的错误是指模型和设计的错误比较结果,即错误是由另一个工具生成的,而不是由matlab生成的,因此如果出现错误,
dbstop将不会发生。