Matlab 将 mat 加载到变量中

Matlab load mat into variable

将数据从 .Mat 文件直接加载到变量中时,它存储的是结构而不是变量本身。

示例:

myData.mat 包含 var1var2var3

如果我这样做:

load myData.mat

它将在我的工作区中创建变量 var1、var2 和 var3。好的。

如果我将 load returns 分配给一个变量,它会存储一个结构。这是正常的,因为我正在加载多个变量。

foo = load('myData.mat')

foo = 
  struct with fields:
    var1
    var2
    var3

但是假设我只对 var1 感兴趣并且我想直接存储到变量 foo.

Load 具有仅从 .mat 文件加载特定变量的选项,但它仍然存储结构

foo = load('myData.mat', 'var1')
foo = 
      struct with fields:
        var1

我希望var1直接赋值给foo

我当然可以:

foo = load('myData.mat', 'var1')
foo = foo.var1;

但这应该是一种在一行中自动执行此操作的方法吧?

它看起来很丑,但可以满足你的要求:

foo = subsref(matfile('myData.mat'),struct('type','.','subs','var1'))

使用 matfile 允许将变量部分加载到内存中,即它只加载必要的内容。函数 subsref 完成索引运算符“.”的工作。在这种情况下。

load 不会以这种方式表现,否则 load 会根据您请求的变量数量表现不一致,这会导致 非常 令人困惑的行为。

为了说明这一点,假设您编写了一个通用程序,想要从 .mat 文件加载所有变量,对它们进行一些修改,然后再次保存它们。您希望此程序与 any 文件一起工作,因此某些文件可能只有一个变量,而有些文件可能存储有多个变量。

如果load使用了您指定的行为,那么您必须添加各种逻辑以在加载和修改文件之前检查文件中存储了多少变量。

这是此程序在 load

当前行为下的样子
function modifymyfile(filename)
    data = load(filename);

    fields = fieldnames(data);

    for k = 1:numel(fields)
        data.(fields{k}) = modify(data.(fields{k}));
    end

    save(filename, '-struct', 'data')
end

如果行为是您认为自己想要的方式

function modifymyfile(filename)

    % Use a matfile to determine the number of variables
    vars = whos(matfile(filename));

    % If there is only one variable
    if numel(vars) == 1
        % Assign that variable (have to use eval)
        tmp = load(filename, vars(1).name);
        tmp = modify(tmp);

        % Now to save it again, you have to use eval to reassign
        eval([vars(1).name, '= tmp;']);

        % Now resave
        save(filename, vars(1).name);
    else
        data = load(filename);

        fields = fieldnames(data);

        for k = 1:numel(fields)
            data.(fields{k}) = modify(data.(fields{k}));
        end

        save(filename, '-struct', 'data');
    end
end

我将留给 reader 来决定其中哪一个更清晰、更可靠。

做你想做的事情的最好方法就是你在你的问题中所展示的。加载后只需重新分配值

data = load('myfile.mat', 'var1');
data = data.var1;

更新

即使您只希望在显式指定变量时不将变量分配给 struct,您仍然会以不一致的行为结束,如果我的程序接受列表,这将使它变得困难要更改为元胞数组的变量数

variables = {'var1', 'var2'}

data = load(filename, variables{:});    % Would yield a struct

variables = {'var1'};

data = load(filename, variables{:});    % Would not yield a struct

@Suever 是对的,但如果您希望使用单行解决方法,则可以这样做:

foo = getfield(load('myData.mat'), 'var1');

如果 MAT 文件包含一个变量,请使用

x = importdata(mat_file_name)