【发布时间】:2014-12-13 01:20:01
【问题描述】:
在 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 代码非常容易受到攻击。
提前谢谢你。
【问题讨论】:
-
settings = load test.mat怎么样?还是global? -
不,在这种情况下,设置不会是全局的,但会导致:settings.settings.test。
-
这被认为是更好的做法,因为它可以更容易地查看加载的变量的来源...blogs.mathworks.com/loren/2012/01/13/…您在错误做法列表中执行第 7 和第 9 项:/
-
如果你将它保存为 ASCII 文件而不是 MAT 文件,你也可以避免结构输出(参见
save和load文档) -
感谢您的链接。我有点不情愿使用 ... = load,因为它需要更改我多年来使用的代码。但是使用像 save('test.mat','-struct','settings') 和 settings = load('test.mat') 这样的东西可以解决这里的问题。我只是想知道,为什么变量的“全局”标志也保存在 .mat 文件中。
标签: matlab