Matlab将mat加载到变量中

时间:2017-02-06 10:00:16

标签: matlab load

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

示例:

myData.mat包含var1var2var3

如果我这样做:

load myData.mat

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

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

foo = load('myData.mat')

foo = 
  struct with fields:
    var1
    var2
    var3

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

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

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

我希望var1直接分配到foo

我当然能做到:

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

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

4 个答案:

答案 0 :(得分:2)

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

如果行为是你想要的方式

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

我会留给读者来决定哪一个更易读和健壮。

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

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

答案 1 :(得分:2)

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

x = importdata(mat_file_name)

答案 2 :(得分:0)

它看起来很难看但是做你想要的东西:

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

使用matfile允许将变量部分加载到内存中,即只加载必要的内容。函数subsref完成索引操作符的工作&#34;。&#34;在这种情况下。

答案 3 :(得分:0)

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

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