Matlab 将 mat 加载到变量中
Matlab load mat into variable
将数据从 .Mat 文件直接加载到变量中时,它存储的是结构而不是变量本身。
示例:
myData.mat
包含 var1
、var2
、var3
如果我这样做:
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)
将数据从 .Mat 文件直接加载到变量中时,它存储的是结构而不是变量本身。
示例:
myData.mat
包含 var1
、var2
、var3
如果我这样做:
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)