我可以在Matlab中查看持久变量吗?

时间:2014-04-07 19:13:35

标签: matlab simulink

我有一个问题,即我很难为这个问题的标题做准备。

我有一个库来计算制冷剂的属性。例如,你给出压力和焓,它会告诉你温度。该库在Fortran中编码,带有mex文件以与Matlab连接。现在,我100%确定库已经彻底调试(它由比我更聪明的人编码,并且已经使用了近十年)。问题肯定在于我如何称呼它。

问题就在于此。我在simulink模型的子系统中从StartFcn回调(.m脚本文件)调用库。我第一次运行这个模型,它运行得很好。因此,我正在服务于该函数的值是正确的。然而,第二次我运行它,它崩溃了。输入两次完全相同。

另外,如果我在两次运行之间执行clear all,那么就不会发生崩溃。但如果我只做clearvarsclear,我仍然会崩溃。当我调试并查看函数调用中传递的变量时,它们都是有效的,并且两次都是相同的。

有人有这方面的经验,或者可以告诉我我可能做错了什么?函数调用中是否存在仅clear all可以删除而不是clear的内容?救我的灵魂!

3 个答案:

答案 0 :(得分:0)

是的,persistent keyword可以声明持久变量。

如果您只想清除那些,请尝试

clear StartFcn

清除函数StartFcn的所有变量。来自documentation

的引用
  

如果name是函数名,则clear name重新初始化函数中的任何持久变量。

答案 1 :(得分:0)

在模拟之间快速尝试clear mex - 这应该清除matlab中的所有mex代码。

要考虑的其他问题......

  • 你能连续两次直接从matlab命令行调用fortran接口吗?
  • 我认为使用m文件函数在simulink中调用fortran是非常低效的。可能考虑编写自己的fortran或C函数来连接代码并直接编译?
  • 如果您使用LoadLibrary加载编译成dll的fortran代码,您是否在mdlTerminate函数中调用FreeLibrary?

希望其中一些有用。

答案 2 :(得分:0)

我会尝试将clear all置于您在StartFcn Callback中调用的函数中。

所以,让我们说你的功能是:

function [out] = nameoffunction(a,b,c)
%do calculation with a,b,c
d = a + b + c;

%output out
out = d;
assignin('base','out',d)
clear all

你可以调用这个函数:

nameoffunction(a,b,c)

让我知道它是否有所改变。如果这样可行,你可以在函数内部尝试其他清除命令。