Matlab 动态持久变量

Matlab 动态持久变量,matlab,function,simulink,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([blk

我有一个使用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

如果您只想存储块的名称,那么可以。如果您需要一些数据和描述性名称,我认为结构的工作原理如下:

data = struct([blkName 'Values'],[]);
set_param(gcb,'UserData',data);
然后当你得到你使用的数据时

ud = get_param(gcb,'UserData');
% ud.([blkName 'Values']) <- your data
或者,您可以在运行时重写函数,以创建一个具有所需名称的变量,yick,但我也看到过类似的操作。嗯

编辑
UserData
是我多次用于对话框回调的方法,因此我相信它会起作用,但是我可能不完全理解您的应用程序。:-)

编辑
如果每次加载模型时都需要保留数据,则必须将
UserDataPersistent
参数设置为
'on'
。这是一个恼人但可以理解的必要功能,用于选择是否忘记关闭模型并从内存中清除后发生的事情。由于这是您的用例,
m脚本中的持久性
变量将不起作用,因为它们在Matlab终止时被遗忘。我相信您需要像a一样使用,以使其在Matlab会话之间保持不变。

具有持久数据的函数和在不同位置为不同目的重用该函数是互斥的。你不能两者兼而有之。您必须将数据放在函数之外。执行此操作的一些方法是,a)已建议的UserData字段,b)用于mat文件的外部文件,或c)基于输入查找的容器(如地图)。

您是否考虑过使用块上的
UserData
字段?这将是一个更加健壮的解决方案。@macduff,因此我必须执行类似于
set_param(gcb,'UserData',[blkName'Values'])的操作。
?我不确定这是否适用于我的实际函数。我需要持久变量,因为脚本位于掩码的对话框回调中。因此,持久变量允许在调用函数之间保留值。我使用了您建议的解决方案。我发现我别无选择,只能使用
set_param(gcb,'UseDataPersistent','on')
。如果不使用它,则在关闭和重新打开simulink模型时,UserData将丢失。也许我还是做错了什么。我想到了这一点,我会修改答案。我试着看看这个
set_param(gcb,'MaskCallbacks',{…})
是否可以帮助我用我的函数替换我实际想要实现的功能。
setappdata(0,[blkName 'Values'],data);

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