2010-08-26 7 views
6

Quiero tener una barra de espera para una operación que lleva bastante tiempo. Aquí está mi código:¿Cómo puedo obtener una barra de espera para trabajar en Matlab?

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) 

El error Matlab da es:

??? Error al utilizar ==> waitbar a 249
argumentos inadecuados para waitbar

Tras la investigación, estoy seguro de que este error debe ocurrir debido al código sorrounding en el bucle.

Nota: El bucle funciona bien sin la barra de espera.

+1

Su ejemplo funciona perfectamente bien en R2010a en OSX. ¿Verificaste que tu ejemplo funciona? Además, ¿estás seguro de que 'counterend' es un doble escalar? – Jonas

+0

Por favor, no me importa que haya cambiado sustancialmente mi pregunta. Esto posiblemente hace que algunas de las respuestas a continuación sean útiles. Lo siento mucho si hubiera perdido el tiempo de alguien, siendo bastante nuevo en Stackoverflow. Si alguien piensa que la eliminación tiene sentido, seguiré votando por ello. – Ingo

Respuesta

5

Correr

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

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

close(h); 

funciona como se espera en 2007a/Windows XP.

En una nota lateral, ayudaría saber qué se contrarresta se define como. Algo rápido de verificar sería asegurarse de que no esté pasando una CELULA.

Correr

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

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

close(h); 

produce un error diferente (véase más adelante) en 2007a, pero este mensaje de error puede haber cambiado en 2008.

??? Función no definida o método '_colonobj' para los argumentos de entrada de tipo 'célula'.

Mi último consejo es que le advierto sobre el uso de la barra de espera para matrices grandes/conjuntos de datos. Si bien creo que es importante informar al usuario del progreso, para mí también existe la preocupación de cuánto tiempo se agrega al ciclo. Trabajando con arreglos que tienen 100k + entradas, me convertí en un usuario religioso del Analizador para ver dónde se estaba gastando realmente el tiempo. Puedo decirte que el tiempo no está en el cálculo de la i/X, todo fue en la actualización de la pantalla de la barra de espera. Para suavizar el golpe de la actualización/extracción, solo actualicé la barra de espera cada 100 a 1000 entradas, lo que me ayudó muchísimo.

EDIT: Actualización respuesta para que coincida con el último código

empecé a atacar este problema en la función anónima, teniendo problemas con ellos en el pasado es una venganza personal mío. Al observar la función, encontré que está utilizando gamma, ¿tiene esto definido como una constante (constante para el bucle/función)? La razón por la que pregunto es que 'gamma' es una función de Matlab y me estaba dando errores al tratar de ejecutar su función por sí mismo. A continuación he modificado ligeramente tu código y aquí funciona bien. Si alguna de las suposiciones que hice son incorrectas, por favor avíseme. Además, si pretendía utilizar la función gamma, a su función le faltan argumentos. ¡Espero que esto ayude!

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) 

Saludos,

Adam

+0

Gracias por compartir sus experiencias. He realizado algunas pruebas y puedo confirmar su punto de que el tiempo se pasa principalmente en la actualización de la barra de espera cuando se ejecuta un ciclo corto. En mi caso, sin embargo, quiero que el usuario pueda cancelar una operación y ver su progreso, ya que él mismo puede establecer la longitud del ciclo indirectamente. Es por eso que aplico la barra de espera. Tu ciclo de prueba funciona bien, pero sigo teniendo problemas con mi caso. – Ingo

+0

¿Es este el código completo? Si es posible, ¿puedes agregar en qué se establece 'contratendencia'? Además, no veo dónde se define 'waitbarcounter'. Supongo que son iguales, ¿puedes confirmar eso? –

3

He comprobado waitbar en R2008b. Hasta ahora, la única forma en que pude reproducir tu error fue haciendo que i/counterend evaluara una matriz con varias filas (un vector 1x2 da resultados interesantes) y cerrando la barra de espera antes de llamar al waitbar(i/counterend).

que no reciben ningún error ejecutando el siguiente:

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

Podría asegurarse de que el pequeño ejemplo anterior se ejecuta sin errores? En caso afirmativo, verifique que la barra de espera no esté cerrada durante la ejecución del ciclo y que counterend sea un escalar (use dbstop if error para detener la ejecución de su código en el momento del error).

Si el ejemplo anterior no funciona sin error, debe usar which waitbar para verificar que está utilizando la barra de espera de Matlab, y no ninguna de las muchas versiones actualizadas de Matlab File Exchange.

+0

Gracias por su ayuda. Definitivamente uso la barra de espera de Matlab. Ejecutar el ejemplo funciona bien. Siguiendo tus sugerencias, verifiqué el tipo de archivo de "contramendante" y resultó ser del tipo doble. Sin embargo, lanzarlo a "waitbarcounter = uint8 (counterterend)" tampoco ayuda. En una nota al margen: después de reiniciar Matlab esta mañana, de repente dejó de darme una visión general de las variables. Ver [aquí] (http://gerth-ac.de/matlab_screen.png). ¿Alguna ayuda sobre eso? – Ingo

1

Operando

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

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

close(h) 

funciona perfectamente como se esperaba en MATLAB R2009a en Windows XP.

1

Lo anterior funciona bien en R2008a en XP también.

Sin embargo, aparece el error que describe si mata la ventana de la barra de espera antes de que aparezca el siguiente comando waitbar. Si desea ser amable al respecto, debe verificar si el identificador h sigue siendo válido antes de emitir waitbar.

+0

Gracias por el consejo, aparentemente este no es el lugar donde yace el error. – Ingo

1

Prefiero usar progressbar escrito por Steve Hoelzer en el MATLAB FEX. No he tenido ningún problema con eso.

0

Su supone que debe utilizar el mango que creó con su primera línea de código cuando se quiere actualizar el camarero, Camarero (it/itmax, h, 'progreso')

+0

Explique con el código y más brevemente – Suresh

+0

agregue más detalles a su respuesta –

Cuestiones relacionadas