6 votes

Comment faire fonctionner une barre d'attente dans Matlab ?

Je veux avoir une barre d'attente pour une opération qui prend un certain temps. Voici mon code :

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) 

L'erreur que Matlab donne est la suivante :

? ?? Erreur d'utilisation de la barre d'attente ==> à 249
Arguments incorrects pour la barre d'attente

Après enquête, je suis sûr que cette erreur doit se produire à cause du code environnant dans la boucle.

Note : La boucle fonctionne bien sans la barre d'attente.

5voto

Adam Lewis Points 2058

Running

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

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

close(h);

Fonctionne comme prévu sur 2007a / Windows XP.

D'ailleurs, il serait utile de savoir ce que l'on entend par contré. Une vérification rapide serait de s'assurer que vous ne lui passez pas un CELL.

Running

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

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

close(h);

Donne lieu à une erreur différente (voir ci-dessous) en 2007a, mais ce message d'erreur peut avoir changé en 2008.

? ?? Fonction ou méthode non définie '_colonobj' pour les arguments d'entrée de type 'cell'.

Mon dernier conseil serait de vous mettre en garde contre l'utilisation de waitbar pour les grands tableaux/ensembles de données. Même si je pense qu'il est important d'informer l'utilisateur de la progression, je m'inquiète également du temps ajouté à la boucle. En travaillant avec des tableaux de plus de 100 000 entrées, je suis devenu un utilisateur assidu du Profiler pour voir où le temps est réellement passé. Je peux vous dire que le temps n'est pas dans le calcul du i/X, il était entièrement dans la mise à jour de l'affichage de la barre d'attente. Pour atténuer le choc de la mise à jour/retrait, je n'ai mis à jour la barre d'attente que toutes les 100 à 1000 entrées, ce qui m'a énormément aidé.

EDIT : Mise à jour de la réponse pour correspondre au dernier code

J'ai commencé à m'attaquer à ce problème au niveau de la fonction anonyme, ayant eu des problèmes avec eux dans le passé, c'est une vendetta personnelle de ma part. En examinant la fonction, j'ai constaté que vous utilisiez gamma, est-ce que vous l'avez défini comme une constante (constante de la boucle / fonction) ? La raison de ma question est que 'gamma' est une fonction Matlab et me donnait des erreurs lorsque j'essayais d'exécuter votre fonction par elle-même. Ci-dessous, j'ai légèrement modifié votre code et cela fonctionne bien ici. Si l'une des hypothèses que j'ai formulées est erronée, veuillez me le faire savoir. De plus, si vous aviez l'intention d'utiliser la fonction gamma, il manque des arguments à votre fonction. J'espère que cela vous aidera !

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) 

Regards,

Adam

3voto

Jonas Points 54073

J'ai vérifié waitbar sur R2008b. Jusqu'à présent, les seules façons dont j'ai pu reproduire votre erreur étaient en ayant i/counterend à un tableau à plusieurs rangs (un vecteur 1x2 donne des résultats intéressants), et en fermant la barre d'attente avant d'appeler waitbar(i/counterend) .

Je n'obtiens pas d'erreur en exécutant ce qui suit :

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

Pourriez-vous vous assurer que le petit exemple ci-dessus fonctionne sans erreur ? Si oui, veuillez vérifier que la barre d'attente n'est pas fermée pendant l'exécution de la boucle, et que counterend est un scalaire (utilisez dbstop if error pour arrêter l'exécution de votre code au moment de l'erreur).

Si l'exemple ci-dessus ne fonctionne pas sans erreur, vous devez utiliser which waitbar pour vérifier que vous utilisez bien la barre d'attente de Matlab, et non l'une des nombreuses versions mises à jour depuis le Matlab File Exchange.

1voto

AndyL Points 4134

Running

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

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

close(h)

fonctionne parfaitement comme prévu avec MATLAB R2009a sous Windows XP.

1voto

Matt Mizumi Points 748

Ce qui précède fonctionne bien avec R2008a sur XP également.

Cependant, vous obtenez l'erreur que vous décrivez si vous fermez la fenêtre de la barre d'attente avant que la prochaine waitbar le commandement arrive. Si vous voulez être gentil, vous devriez vérifier si le handle h est toujours valide avant d'émettre waitbar .

1voto

Doresoom Points 4081

Je préfère utiliser barre de progression écrit par Steve Hoelzer sur le FEX de MATLAB. Je n'ai pas eu de problèmes avec lui.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X