您无法在MATLAB中监视保存命令的进度.这是因为MATLAB不在另一个线程中执行保存操作,而是使用程序的主线程阻止您在保存文件时执行任何操作.
您可以提供一个对话框,告诉用户保存正在发生,并在保存完成后将其删除.
dlg = msgbox('Save operation in progress...');
save('output.mat');
if ishghandle(dlg)
delete(dlg);
end
潜在的解决方案
如果您确实要保存多个变量并监视进度,可以使用-append标志独立保存和追加每个变量.
vars2save = {'a', 'b', 'c', 'd'};
outname = 'filename.mat';
hwait = waitbar(0, 'Saving file...');
for k = 1:numel(vars2save)
if k == 1
save(outname, vars2save{k})
else
save(outname, vars2save{k}, '-append');
end
waitbar(k / numel(vars2save), hwait);
end
delete(hwait);
基准
我做了一个基准测试,看看第二种方法如何影响总节省时间.似乎使用-append来保存每个变量的性能损失比预期的要小.这是代码和结果.
function saveperformance
% Number of variables to save each time through the test
nVars = round(linspace(1, 200, 20));
outname = 'filename.mat';
times1 = zeros(numel(nVars), 1);
times2 = zeros(numel(nVars), 1);
for k = 1:numel(nVars)
% Delete any pre-existing files
if exist('outname')
delete(outname)
end
% Create variable names
vars2save = arrayfun(@(x)['x', num2str(x)], 1:nVars(k), 'Uniform', 0);
% Assign each variable with a random matrix of dimensions 50000 x 2
for m = 1:numel(vars2save)
eval([vars2save{m}, '=rand(50000,2);']);
end
% Save all at once
tic
save(outname, vars2save{:});
times1(k) = toc;
delete(outname)
% Save one at a time using append
tic
for m = 1:numel(vars2save)
if m == 1
save(outname, vars2save{m});
else
save(outname, vars2save{m}, '-append');
end
end
times2(k) = toc;
end
% Plot results
figure
plot(nVars, [times1, times2])
legend({'All At Once', 'Append'})
xlabel('Number of Variables')
ylabel('Execution Time (seconds)')
end