Matlab将mat加载到变量中

Sem*_*aki 6 matlab load

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

例:

myData.mat 包括var1,var2,var3

如果我做:

load myData.mat
Run Code Online (Sandbox Code Playgroud)

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

如果我将load返回的内容分配给变量,它会存储一个结构.这是正常的,因为我正在加载几个变量.

foo = load('myData.mat')

foo = 
  struct with fields:
    var1
    var2
    var3
Run Code Online (Sandbox Code Playgroud)

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

Load有一个选项,只能加载.mat文件中的特定变量,但它仍然存储一个struct

foo = load('myData.mat', 'var1')
foo = 
      struct with fields:
        var1
Run Code Online (Sandbox Code Playgroud)

我希望var1被直接分配到foo.

我当然可以这样做:

foo = load('myData.mat', 'var1')
foo = foo.var1;
Run Code Online (Sandbox Code Playgroud)

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

Sue*_*ver 1

load不这样做,否则load根据您请求的变量数量,行为会不一致,这将导致极其混乱的行为。

为了说明这一点,假设您编写了一个通用程序,想要从 .mat 文件加载所有变量,对它们进行一些修改,然后再次保存它们。您希望该程序能够处理任何文件,因此有些文件可能有一个变量,有些文件可能有多个变量存储在其中。

如果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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

我将让读者来决定其中哪一个更清晰、更可靠。

做你想做的事情的最佳方法正是你在问题中所显示的。加载后只需重新赋值即可

data = load('myfile.mat', 'var1');
data = data.var1;
Run Code Online (Sandbox Code Playgroud)

更新

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

variables = {'var1', 'var2'}

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

variables = {'var1'};

data = load(filename, variables{:});    % Would not yield a struct
Run Code Online (Sandbox Code Playgroud)