MATLAB:保存文件时显示进度条?

时间:2016-07-01 15:52:40

标签: matlab matlab-guide mat-file

我有一个MATLAB GUI(在GUIDE中开发),我给用户提供了保存某些数据结构变量的选项(作为.mat文件)。但是,这是一个很大的.mat文件,保存此文件可能需要一分钟。没有任何进度指示,我无法告诉用户何时保存文件(允许他们在GUI中执行其他操作)。有没有办法创建一个链接到保存功能进度的等待栏?任何帮助,将不胜感激!

1 个答案:

答案 0 :(得分:5)

您无法在MATLAB中监视save命令的进度。这是因为MATLAB不在另一个线程中执行保存操作,而是使用程序的主线程,这会阻止您在保存文件时执行任何操作。

您可以提供一个对话框,告诉用户保存正在发生,只需在保存完成后将其删除。

dlg = msgbox('Save operation in progress...');

save('output.mat');

if ishghandle(dlg)
    delete(dlg);
end

潜在解决方案

如果您确实想保存多个变量并监控进度,可以使用-append标记save并独立附加每个变量。

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

enter image description here