将.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)
但它应该是一种在一行中自动执行此操作的方法吗?
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)