在 Matlab 中,当将变量声明为全局变量并使用 save() 命令保存它时,在新会话中加载 .mat 文件后,该变量也是全局变量。以下代码显示了此行为:
一开始,我没有变量:
>> who
>> who global
然后,我创建全局变量并保存它:
>> global settings
>> settings.test = 1;
>> who
Your variables are:
settings
>> who global
Your variables are:
settings
>> save('test.mat','settings');
之后我清除工作区和全局变量(或启动一个新的 Matlab 会话)
>> clear
>> clearvars -global
>> who
>> who global
当我加载 .mat 文件时,该变量再次被标记为全局变量,即使我现在没有指定它。
>> load test.mat
>> who
Your variables are:
settings
>> who global
Your variables are:
settings
>> clear
>> who
>> who global
Your variables are:
settings
有什么办法可以阻止这种行为吗?
在我看来,“全局”标志是与变量一起保存的。这真的有用吗?假设有人向我发送了一份包含数据的 mat 文件,其中变量被声明为全局变量。即使在函数中加载此文件,它也会将数据传播到我的完整会话中。对我来说,这使得 Matlab 代码非常容易受到攻击。
先感谢您。
正如 Dan 在评论中指出的那样,将包含全局变量的 mat 文件加载到结构中会剥离全局属性。
foo = load('settings.mat');
为了修复全局问题,同时对其余代码(生成代码和使用 settings.mat 文件的代码)影响最小,您可以提取所需的字段:
foo = load('settings.mat');
settings = foo.settings;
这既删除了全局属性,又声明了设置变量的来源。 (这在稍后执行不可避免的代码考古时确实很有帮助)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)