Как мне заставить панель ожидания работать в Matlab? - PullRequest
6 голосов
/ 26 августа 2010

Я хочу иметь панель ожидания для операции, которая занимает довольно много времени. Вот мой код:

h = waitbar(0,'Please wait...');

for i=1:counterend
    waitbar(i/waitbarcounter)
    Atemp    = At+i*step;
    handle   = @(M) 1/M^2*((2/(gamma+1))*(1+(gamma-1)*M^2/2))^((gamma+1)/(gamma-1))-(Atemp/At)^2;
    Mach     = fzero(handle, 5);
    Aplot(i) =  Atemp/At;
    Tplot(i) = Tc / (1+(gamma-1)*Mach^2/2);
    Mplot(i) = Mach;
    plot(Aplot, Tplot)
end

close(h) 

Ошибка, которую дает Matlab:

??? Ошибка при использовании ==> панели ожидания на 249
Неправильные аргументы для панели ожидания

После расследования я уверен, что эта ошибка должна возникать из-за окружающего кода в цикле.

Примечание: цикл работает нормально без панели ожидания.

Ответы [ 6 ]

5 голосов
/ 27 августа 2010

Запуск

counterend = 10000;
>> h = waitbar(0,'Please wait...');

for i=1:counterend
    waitbar(i/counterend)
end

close(h);

Работает, как и ожидалось, в 2007a / Windows XP.

С другой стороны, это помогло бы узнать, что определяется как счетчик.Что-то быстрое, что можно проверить, это убедиться, что вы не передаете ему CELL.

Running

counterend = {10000};
h = waitbar(0,'Please wait...');

for i=1:counterend
    waitbar(i/counterend)
end

close(h);

Выдает другую ошибку (см. Ниже) в 2007a, но это сообщение об ошибке может иметьизменился в 2008 году.

???Неопределенная функция или метод «_colonobj» для входных аргументов типа «ячейка».

Последним моим советом было бы предостеречь вас об использовании панели ожидания для больших массивов / наборов данных.Хотя я думаю, что важно информировать пользователя о прогрессе, для меня также существует беспокойство относительно того, сколько времени добавлено в цикл.Работая с массивами, в которых более 100 000 записей, я стал религиозным пользователем Profiler, чтобы увидеть, где на самом деле тратится время.Я могу сказать вам, что время не в расчете i / X, это было все в обновлении дисплея панели ожидания.Чтобы смягчить удар обновления / отрисовки, я обновлял панель ожидания только через каждые 100-1000 записей, что очень помогло.

РЕДАКТИРОВАТЬ: обновленный ответ, чтобы соответствовать последнему коду

Я впервые начал атаковать этопроблема в анонимной функции, проблемы с ними в прошлом, это моя личная вендетта.При просмотре функции, которую я обнаружил, вы используете гамму, определено ли это как константа (постоянная для цикла / функции)?Причина, по которой я спрашиваю, состоит в том, что «гамма» является функцией Matlab и выдает мне ошибки при попытке запустить вашу функцию самостоятельно.Ниже я немного изменил ваш код, и здесь все работает нормально.Если какое-либо из моих предположений неверно, пожалуйста, дайте мне знать.Кроме того, если вы намеревались использовать гамма-функцию, в вашей функции отсутствуют какие-либо аргументы.Надеюсь, это поможет!

clc
h = waitbar(0,'Please wait...');
counterend = 1000;
waitbarcounter = counterend;
g_amma = 7;
At = 34;
step = 2;
Tc = 42;

for i=1:counterend
    waitbar(i/waitbarcounter)
    Atemp    = At+i*step;
    handle   = @(M) 1/M^2*((2/(g_amma+1))*(1+(g_amma-1)*M^2/2))^((g_amma+1)/(g_amma-1))-(Atemp/At)^2;
    Mach     = fzero(handle, 5);
    Aplot(i) =  Atemp/At;
    Tplot(i) = Tc / (1+(g_amma-1)*Mach^2/2);
    Mplot(i) = Mach;
    plot(Aplot, Tplot)
end

close(h) 

С уважением,

Адам

3 голосов
/ 26 августа 2010

Я проверил waitbar на R2008b. Пока что я смог воспроизвести вашу ошибку только при помощи i/counterend вычисления массива с несколькими строками (вектор 1x2 дает интересные результаты) и закрытии панели ожидания перед вызовом waitbar(i/counterend).

Я не получаю никакой ошибки при выполнении следующего:

h = waitbar(0,'Please wait...');
counterend = 1000;
for i=1:counterend
    waitbar(i/counterend)
end
close(h)

Не могли бы вы убедиться, что приведенный выше маленький пример работает без ошибок? Если да, пожалуйста, убедитесь, что панель ожидания не закрыта во время выполнения цикла, и что counterend является скаляром (используйте dbstop if error, чтобы остановить выполнение вашего кода во время ошибки).

Если приведенный выше пример не работает без ошибок, вы должны использовать which waitbar, чтобы проверить, используете ли вы панель ожидания Matlab, а не какую-либо из множества обновленных версий из Matlab File Exchange.

1 голос
/ 26 августа 2010

Я предпочитаю использовать прогрессбар , написанный Стивом Хоэлзером на MATLAB FEX. У меня не было проблем с этим.

1 голос
/ 26 августа 2010

Вышеописанное прекрасно работает и на R2008a на XP.

Однако вы получите описанную ошибку, если убьете окно панели ожидания до того, как придет следующая команда waitbar. Если вы хотите быть в курсе этого, перед тем как выдать waitbar.

, убедитесь, что дескриптор h все еще действует
1 голос
/ 26 августа 2010

Бег

counterned=1000;
h = waitbar(0,'Please wait...');

for i=1:counterend
    waitbar(i/counterend)
end

close(h)

отлично работает, как и ожидалось, в MATLAB R2009a в Windows XP.

0 голосов
/ 15 октября 2014

Предполагается, что вы используете дескриптор, который вы создали с первой строкой кода, когда вы хотите обновить официанта, Официанта (он / itmax, ч, 'прогресс')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...