【问题标题】:Loading a MAT file without creating an intermediate variable加载 MAT 文件而不创建中间变量
【发布时间】:2019-06-24 21:20:39
【问题描述】:

我正在尝试加载一个 MAT 文件并获取一个数据集作为输出。如果我跑

a = load('foo.mat');

a 是一个结构而不是数据集。为了获得数据集,我需要运行以下代码

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

不过,通过这种方式,在我的工作区中,我有两个相同的数据集,特别是 afoo

有没有办法只写一行代码并导入 MAT 文件并获得一个数据集而不是两个?

【问题讨论】:

  • 在secong选项中,如果你不指定a=foo,你有一个数据集叫foo
  • 是的,使用load('foo.mat');,您将只有foo。如果你希望它被称为a,那么在你的第二个sn-p的末尾添加clear foo
  • @Adiel 是的,我忘了补充一点,我不希望将变量称为“foo”(在我的实际情况下,该名称很长且相对不可用)。
  • 请注意,当您执行a=foo 时,MATLAB 不会复制数据。只要您不修改这些变量之一,您的数据就只会在内存中保存一次。
  • 您可以使用a = load('foo.mat'); a = a.foo;。它是芯片,实际上没有复制。

标签: matlab file-io dataset structure mat-file


【解决方案1】:

load 不将其分配给变量是个坏主意,因为这会导致难以跟踪对工作区的更改。

我通常会这样做,

a = struct2array(load('foo.mat'));

但这有一些限制(例如,它仅在 foo.mat 包含单个变量时才有效)。

【讨论】:

  • 仅当foo.mat 包含单个变量时才有效 您可以使用a = struct2array(load('foo.mat', 'foo'));
  • @LuisMendo 是的,感谢您的澄清。我的意思是命令按原样编写对单个变量有好处。
【解决方案2】:

创建一个单独的函数来加载您的数据。

function[foo] = loader()
load('foo.mat');
end

然后称它为:

a = loader();

因为函数有一个封闭的范围,您可以使用它们在 mat 文件中的名称加载变量。当函数返回时,您将值分配给您想要的任何名称。

【讨论】:

  • 这绝对比直接加载到活动工作区要好,但是像这样的函数的问题是 foo 在技术上没有在函数范围内定义,这会发出警告 IIRC .我建议为所有预期输出添加“无效”默认值(例如NaN),或使用exist 测试所有需要的变量是否已实际创建。
  • @Dev-iL 添加%#ok 将抑制文本编辑器上的警告。根据您的编码标准,这可能就足够了。 (我承认这是我的一个 YOLO 建议)。
猜你喜欢
  • 2012-05-28
  • 2019-12-17
  • 1970-01-01
  • 2014-07-21
  • 2018-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多