gpt4 book ai didi

matlab - 在不加载 .mat 文件的情况下快速检查变量是否在 .mat 文件中的方法? 'who'/'whos' 并不比加载快.. 比 'who' 更好的选择?

转载 作者:行者123 更新时间:2023-12-04 03:04:59 25 4
gpt4 key购买 nike

我有一个名为“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

关于matlab - 在不加载 .mat 文件的情况下快速检查变量是否在 .mat 文件中的方法? 'who'/'whos' 并不比加载快.. 比 'who' 更好的选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45442161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com