动态持久变量

时间:2013-06-20 17:05:05

标签: matlab function simulink

我有一个使用2个持久变量的函数。对于实际的simulink块,函数输入为gcb。我想在各种块上使用该函数,因此我希望使用引用块名称的名称声明持久变量。

function testBlock(blk)
    blkName = get_param(blk, 'name')
    persistent blkValues % this works for one block
    % but I want something like this
    persistent eval([blkName 'Values']) % doesn't work
    ...
end

2 个答案:

答案 0 :(得分:1)

如果你想要的只是存储块的名称,那么是。如果您想要一些数据和描述性名称,我认为结构可以像:

data = struct([blkName 'Values'],[]);
set_param(gcb,'UserData',data);

然后,当您获得所使用的数据时,

ud = get_param(gcb,'UserData');
% ud.([blkName 'Values']) <- your data

或者您可以使用全局appdata存储空间:

setappdata(0,[blkName 'Values'],data);

data = getappdata(0,[blkName 'Values']);

或者您可以在运行时重写该函数以创建一个具有您想要的名称的变量 yick ,但我已经看到了类似的事情。 HTH!

修改 UserData是我多次用于对话回调的方法,所以我确信它会起作用,但是我可能不完全理解你的应用程序。 : - )

修改 如果每次加载模型时都需要保留数据,则必须将UserDataPersistent参数设置为'on'。这是一个烦人的,但可以理解的必要功能,可以选择是否忘记在模型关闭和刷新内存后发生的事情。由于这是您的用例,因此在M-script中的persistent变量将无效,因为在Matlab终止时它们会被遗忘。我相信你需要像setpref一样使用它来在Matlab会话之间保持它。

答案 1 :(得分:1)

具有持久数据的功能,并且为不同目的在不同位置重用该功能是互斥的。你不能两者都做。您必须将数据放在函数之外。这样做的一些方法是:a)已经建议的UserData字段,b)例如用于例如外部文件的外部文件。一个mat文件,或c)一个像地图一样的容器,可以根据输入进行查找。