1

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

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
4

2 回答 2

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,但我已经看到了类似的事情。!

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

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

于 2013-06-20T19:14:27.553 回答
1

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

于 2013-06-21T00:02:55.813 回答