【问题标题】:Save global variables in MatlabMatlab中保存全局变量
【发布时间】: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 文件,你也可以避免结构输出(参见 saveload 文档)
  • 感谢您的链接。我有点不情愿使用 ... = load,因为它需要更改我多年来使用的代码。但是使用像 save('test.mat','-struct','settings') 和 settings = load('test.mat') 这样的东西可以解决这里的问题。我只是想知道,为什么变量的“全局”标志也保存在 .mat 文件中。

标签: matlab


【解决方案1】:

正如 Dan 在 cmets 中所指出的,将包含全局变量的 mat 文件加载到结构中会去除全局属性。

foo = load('settings.mat'); 

要解决全局问题,同时尽量减少对其余代码的影响,包括生成和使用 settings.mat 文件的代码,然后您可以提取所需的字段:

foo = load('settings.mat');
settings = foo.settings;

这既删除了全局属性,又声明了设置变量的来源。 (这在稍后执行不可避免的代码考古时真的很有帮助)。

【讨论】:

  • 是的,你是对的。有几种方法可以避免这个问题。基本上我只是想知道为什么会发生这种情况,或者是否有任何理由说明实际行为是有用的。我在保存命令中使用“-struct”更改了部分代码。
  • 我怀疑这是save('workspace.mat') 用例的产物,它将整个工作区保存到文件中。我怀疑这背后的想法是“内存转储”而不是“保存变量”,因此保存变量的所有属性也是有意义的。
  • 好吧,也许是这样。毕竟,我花了一些时间才明白我的代码的一些奇怪行为是由这个特性引起的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-06
  • 2013-03-09
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
相关资源
最近更新 更多