在不加载 .mat 文件的情况下快速检查变量是否在 .mat 文件中的方法? 'who'/'whos' 并不比加载快.. 比 'who' 更好的选择?
Fast way to check if variable is in .mat file without loading .mat file? 'who'/'whos' is not faster than loading.. Better options than 'who'?
我有一个名为 "myfile.mat" 的 .mat 文件,其中包含一个巨大的变量 data
,在某些情况下,还有另一个变量 data_info
。检查 .mat 文件是否包含“data_info”变量的最快方法是什么?
who 或 whos 命令并不比简单地加载和测试变量的存在更快。
nRuns=10;
%simply loading the complete file
tic
for p=1:nRuns
load('myfile.mat');
% do something with variable
if exist('data_info','var')
%do something
end
end
toc
% check with who
tic
for p=1:nRuns
variables=who('-file','myfile.mat');
if ismember('data_info', variables)
% do something
end
end
toc
% check with whose
tic
for p=1:nRuns
info=whos('-file','myfile.mat');
if ismember('data_info', {info.name})
%do something
end
end
toc
所有方法大致花费相同的时间(这是变慢的方式,因为 data
很大。
但是,这非常快:
tic
for p=1:nRuns
load('myfile.mat','data_info');
if exist('data_info', 'var')
%do something
end
end
toc
但如果 data_info
不存在,它会发出警告。我可以取消警告,但这似乎不是执行此操作的最佳方法。还有哪些其他选项?
编辑
使用 who('-file', 'myfile.mat', 'data_info')
也不是更快:
tic
for p=1:nRuns
if ~isempty(who('-file', 'myfile.mat', 'data_info'))
% do something
end
end
toc % this takes 7 seconds, roughly the same like simply loading complete .mat file
尝试使用 who
将其限制为仅特定变量:
...
if ~isempty(who('-file', 'myfile.mat', 'data_info'))
%do something
end
为解决方案计时:
在不同的解决方案上使用 timeit
(下面包含的代码,Windows 7 上的 运行 和 MATLAB 版本 R2016b)表明基于 who
的解决方案看起来最快,我上面建议的那个在速度上略有优势。这是时间安排,从最慢到最快:
Load whole file: 0.368235871921381 sec
Using matfile: 0.001973860748417 sec
Load only `data_info`: 0.000316989486384 sec
Using whos + ismember: 0.000174207817967 sec
Using who + ismember: 0.000151289605527 sec
Using who + isempty: 0.000137261391331 sec
我使用了包含以下变量的示例 MAT 文件:
data = ones(10000);
data_info = 'hello';
测试代码如下:
function T = infotest
T = zeros(6, 1);
T(1) = timeit(@use_load_exist_1);
T(2) = timeit(@use_load_exist_2);
T(3) = timeit(@use_matfile);
T(4) = timeit(@use_whos_ismember);
T(5) = timeit(@use_who_ismember);
T(6) = timeit(@use_who_isempty);
end
function isThere = use_load_exist_1
load('infotest.mat');
isThere = exist('data_info', 'var');
end
function isThere = use_load_exist_2
load('infotest.mat', 'data_info');
isThere = exist('data_info', 'var');
end
function isThere = use_matfile
isThere = isprop(matfile('infotest.mat'), 'data_info');
end
function isThere = use_whos_ismember
info = whos('-file', 'infotest.mat');
isThere = ismember('data_info', {info.name});
end
function isThere = use_who_ismember
variables = who('-file', 'infotest.mat');
isThere = ismember('data_info', variables);
end
function isThere = use_who_isempty
isThere = ~isempty(who('-file', 'infotest.mat', 'data_info'));
end
可以使用who
命令https://www.mathworks.com/help/matlab/ref/who.html
此语法是调用 who
和文件的指示符,然后是您要查找的变量。您不需要查找文件中的所有变量
伪语法如下
variable = who('-file','yourfilenamehere','data_info')
从那里你可以打电话给
if ~isempty(variable)
%do something
end
这仅在文件中搜索该变量。在您的 who
命令版本中,您查找所有变量,而这只查找一个。
所以它有点乱,但我只是尝试了这个,无论大小如何,它几乎都是即时的。让我知道它是否适合你。
请原谅格式,我不习惯这里的正确格式。
注意:此解决方案使用已内置到 matlab 中的低级 HDF5 库,因此此方法假定您的 mat 文件是 HDF5 (-v7.3)。不然不行。
您可以通过这样做来确定是一个有效的 hdf5 文件:
isValidHDF = H5F.is_hdf5('my_file.mat');
查看您的变量是否存在:
isThere = false; %Initialize as default value of false
fid = H5F.open('myfile.mat') % Use low level H5F builtin to open
try % Never use try/catch but this is a good for when its ok
% Try to open the h5 group. Will error and catch to report back false if the variable isnt there, otherwise the variable exists
gid = H5G.open(fid,['/data_info']); % Note: the "/" is required and OS independent, so its never "\" even in windows
% I think this makes sure the variable isnt empty if the group opened successfully, but it hasnt been a problem yet
hInfo = H5G.get_info(gid);
isThere = hInfo.nlinks > 0;
H5G.close(gid);
end
H5F.close(fid);
我有一个名为 "myfile.mat" 的 .mat 文件,其中包含一个巨大的变量 data
,在某些情况下,还有另一个变量 data_info
。检查 .mat 文件是否包含“data_info”变量的最快方法是什么?
who 或 whos 命令并不比简单地加载和测试变量的存在更快。
nRuns=10;
%simply loading the complete file
tic
for p=1:nRuns
load('myfile.mat');
% do something with variable
if exist('data_info','var')
%do something
end
end
toc
% check with who
tic
for p=1:nRuns
variables=who('-file','myfile.mat');
if ismember('data_info', variables)
% do something
end
end
toc
% check with whose
tic
for p=1:nRuns
info=whos('-file','myfile.mat');
if ismember('data_info', {info.name})
%do something
end
end
toc
所有方法大致花费相同的时间(这是变慢的方式,因为 data
很大。
但是,这非常快:
tic
for p=1:nRuns
load('myfile.mat','data_info');
if exist('data_info', 'var')
%do something
end
end
toc
但如果 data_info
不存在,它会发出警告。我可以取消警告,但这似乎不是执行此操作的最佳方法。还有哪些其他选项?
编辑
使用 who('-file', 'myfile.mat', 'data_info')
也不是更快:
tic
for p=1:nRuns
if ~isempty(who('-file', 'myfile.mat', 'data_info'))
% do something
end
end
toc % this takes 7 seconds, roughly the same like simply loading complete .mat file
尝试使用 who
将其限制为仅特定变量:
...
if ~isempty(who('-file', 'myfile.mat', 'data_info'))
%do something
end
为解决方案计时:
在不同的解决方案上使用 timeit
(下面包含的代码,Windows 7 上的 运行 和 MATLAB 版本 R2016b)表明基于 who
的解决方案看起来最快,我上面建议的那个在速度上略有优势。这是时间安排,从最慢到最快:
Load whole file: 0.368235871921381 sec
Using matfile: 0.001973860748417 sec
Load only `data_info`: 0.000316989486384 sec
Using whos + ismember: 0.000174207817967 sec
Using who + ismember: 0.000151289605527 sec
Using who + isempty: 0.000137261391331 sec
我使用了包含以下变量的示例 MAT 文件:
data = ones(10000);
data_info = 'hello';
测试代码如下:
function T = infotest
T = zeros(6, 1);
T(1) = timeit(@use_load_exist_1);
T(2) = timeit(@use_load_exist_2);
T(3) = timeit(@use_matfile);
T(4) = timeit(@use_whos_ismember);
T(5) = timeit(@use_who_ismember);
T(6) = timeit(@use_who_isempty);
end
function isThere = use_load_exist_1
load('infotest.mat');
isThere = exist('data_info', 'var');
end
function isThere = use_load_exist_2
load('infotest.mat', 'data_info');
isThere = exist('data_info', 'var');
end
function isThere = use_matfile
isThere = isprop(matfile('infotest.mat'), 'data_info');
end
function isThere = use_whos_ismember
info = whos('-file', 'infotest.mat');
isThere = ismember('data_info', {info.name});
end
function isThere = use_who_ismember
variables = who('-file', 'infotest.mat');
isThere = ismember('data_info', variables);
end
function isThere = use_who_isempty
isThere = ~isempty(who('-file', 'infotest.mat', 'data_info'));
end
可以使用who
命令https://www.mathworks.com/help/matlab/ref/who.html
此语法是调用 who
和文件的指示符,然后是您要查找的变量。您不需要查找文件中的所有变量
伪语法如下
variable = who('-file','yourfilenamehere','data_info')
从那里你可以打电话给
if ~isempty(variable)
%do something
end
这仅在文件中搜索该变量。在您的 who
命令版本中,您查找所有变量,而这只查找一个。
所以它有点乱,但我只是尝试了这个,无论大小如何,它几乎都是即时的。让我知道它是否适合你。
请原谅格式,我不习惯这里的正确格式。
注意:此解决方案使用已内置到 matlab 中的低级 HDF5 库,因此此方法假定您的 mat 文件是 HDF5 (-v7.3)。不然不行。
您可以通过这样做来确定是一个有效的 hdf5 文件:
isValidHDF = H5F.is_hdf5('my_file.mat');
查看您的变量是否存在:
isThere = false; %Initialize as default value of false
fid = H5F.open('myfile.mat') % Use low level H5F builtin to open
try % Never use try/catch but this is a good for when its ok
% Try to open the h5 group. Will error and catch to report back false if the variable isnt there, otherwise the variable exists
gid = H5G.open(fid,['/data_info']); % Note: the "/" is required and OS independent, so its never "\" even in windows
% I think this makes sure the variable isnt empty if the group opened successfully, but it hasnt been a problem yet
hInfo = H5G.get_info(gid);
isThere = hInfo.nlinks > 0;
H5G.close(gid);
end
H5F.close(fid);