将.Mat文件中的数据直接加载到变量中时,它会存储一个struct而不是变量本身。
示例:
myData.mat
包含var1
,var2
,var3
如果我这样做:
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;
但它应该是一种在一行中自动执行此操作的方法吗?
答案 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');