Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Histograma. Obtener máximos y mínimos relativos (https://www.clubdelphi.com/foros/showthread.php?t=42289)

Delphius 10-04-2007 23:11:21

Histograma. Obtener máximos y mínimos relativos
 
Buenas a todos...

Como dice la pregunta... alguien puede indicarme, si es tan amable, ¿como sería el algoritmo para obtener los máximos y mínimos relativos dado un histograma?

Verán... tengo este código, que se que no es muy eficiente:

Código Delphi [-]
PreviusUp := Histogram[MinValue];
          for j := (MinValue + 1) to MaxValue do
            begin
              if Histogram[j] > PreviusUp
                 then begin
                        with Valleys.Maximum do
                          begin
                            inc(Count);
                            SetLength(Value, Count);
                            if (j = (MinValue + 1))
                               then Value[Count - 1] := MinValue
                               else Value[Count - 1] := j;
                          end;
                       end
                 else begin
                        with Valleys.Minimum do
                          begin
                            inc(Count);
                            SetLength(Value, Count);
                            if (j = (MinValue + 1))
                               then Value[Count - 1] := MinValue
                               else Value[Count - 1] := j;
                          end;
                      end;
            end;

Siendo las estructuras de esta manera:

Código Delphi [-]
THistogram = array[0..MAX_RGB] of integer;

  {* Estructura de información asociada a valles *}
  TValleyInfo = record
    Count: integer;
    Value: TIntegerDynArray;
  end;

  {* Estructura asociada a Valles *}
  // Un valle está formado por una secuencia de Maximos y Mínimos
  TValley = record
    Count: integer;
    Maximum: TValleyInfo;
    Minimum: TValleyInfo;
  end;

Se que a el código le falta refinar....
Pero de acuerdo a mi lógica (que es muy probable de que esté errado) debería ir copiando en la estructura de maximum y minimum los valores posicionales del histograma que cumple con los máximos y mínimos dependiendo del valor anterior...

Pues, hago recorrer ambas estructuras y no pasa nada... es como si fuera que no encuentra ningún máximo o minimo:
Código Delphi [-]
ListBox1.Items.Add('--- Valles: ');
        smax := 'Maximos: ';
        smin := 'Minimos: ';
        for j := 0 to Channel[i].Valleys.Maximum.Count - 1 do
          begin
            valor := Channel[i].Valleys.Maximum.Value[j];
            smax := smax + IntToStr(valor) + ',';
          end;
        for j := 0 to Channel[i].Valleys.Minimum.Count - 1 do
          begin
            valor := Channel[i].Valleys.Minimum.Value[j];
            smin := smin + IntToStr(valor) + ',';
          end;

Llevo un tiempo tratando de averiguar donde está la falla... y ya no se por donde ver... aunque el código para obtener los valores no es el correcto... debería ir guardando algo... ¿?

Desde ya muchas gracias por tomarse su tiempo,
Saludos,

Robert01 11-04-2007 04:42:30

Hola Delphius

Mirá este link

Está el código fuente de un programa que hace un histograma, aunque lo hace al abrir un archivo y leer te puede servir de algo.

A lo mejor en la página de la Facutad de Ciencias Agronómicas de la UNC pueda haber algo, ellos desarrollaron un programa que creo que se llama infostat en delphi.

Saludos

Delphius 11-04-2007 05:29:17

A ver...
 
2 Archivos Adjunto(s)
Muchas gracias Robert01 por ofrecer tu ayuda.
Lamento decirte que he mirado el código del link y la verdad es esa parte no me sirve de nada.
El problema no pasa por armar un histograma, a eso ya lo tengo hecho. La situación complicada para mi es que no se porqué motivo, razón o circunstancia, no está registrando en el vector dinámico los valores máximos y mínimos.

Si bien el código que expuse anteriormente no cumple con el cometido. Lo he realizado para comprobar si estaba funcionando el vector... y la verdad es que no funciona.

Lo curioso es que yo ya tengo implementado un vector dinámico similar a ese para llevar un registro de otras cosas y éste si funciona.

Envío las unidades para ver si alguien ve la luz.
Saludos,

Robert01 11-04-2007 14:32:58

Cita:

Empezado por Delphius
El problema no pasa por armar un histograma, a eso ya lo tengo hecho. La situación complicada para mi es que no se porqué motivo, razón o circunstancia, no está registrando en el vector dinámico los valores máximos y mínimos.

Delphius ¿en ningún momento registra ningún valor? ¿No será que se registran y se borran en el siguiente ciclo del bucle?

Delphius 15-04-2007 05:07:42

watch dice que no hay nada... F7 pasa las instrucciones...
 
Bueno, Robert01 estuve probando lo que tu comentabas, y la verdad no es que se "pisa" los datos con el paso siguiente.
De acuedo a las pruebas (paso a paso) que hice, el código se ejecuta.. la instrucción se realiza pero si observo con watch, se ve que no incrementa la cantidad ni pide la memoria adecuada, ni le asigna el valor...

Debería poder realizar esta parte:

Código Delphi [-]
in(Count);
SetLength(Value, Count);
Value[Count - 1] := 0;

La verdad es que me parece muy raro... si anteriormente a esta parte del código realiza el procedimiento similar para el almacenamiento de la moda (ver zip adjuntado en el post anterior) ¿Porqué no lo hace para los máximos y mínimos? Es un misterio...

No le veo error al código. Demasiado raro: que con F7 se ve que se ejecuta estas instrucciones, pero que en realidad no está incrementando el valor ni almacenando.... He probado moviendo el código un poco más arriba... he alterado el código de diversas formas, incluso la más absurda:
Código Delphi [-]
ImageInfo.Channel[k].Vallyes.Maximum.Count
ImageInfo.Channel[k]....
Y Nada... las instrucciones son realizadas... pero el watch dice otra cosa.

Si alguien ve el error, ¿me puede dar un buen zopapo (paliza) virtual?

Muchas gracias... por ayudarme Robert01.
Saludos

Robert01 15-04-2007 13:06:54

Delphius:

Yo hace un tiempo estaba probando un código y por un error que no se donde está no ejecutaba el bucle porque los índices permanecían en 0. según cual fuera el caso.

La primera vez que usaba el bucle andaba todo bien pero a la segunda vez que trataba de usar esa parte de código ocurría el error.
No se si había declarado las variables en forma inadecuada o que.

Yo lo que hice fue usar un bucle do while para ver lo que pasaba.

Saludos

Delphius 16-04-2007 07:35:00

Soy un brujo...
 
Pues yo ya no se que hacer... no funciona... he probado haciendolo con while, for, Repeat... y nada... es como dices:
Cita:

Empezado por Robert01
los índices permanecían en 0.

El bucle (ya sea FOR, REPEAR, WHILE) se ejecuta... pero no cambia en nada los valores...:eek:

¡Brujería!:o:confused:

Saludos,

Robert01 16-04-2007 12:12:46

Delphius:

Así debería andar bien

Yo llamaba dos veces un procedure, el índice que permanecía en 0 era k, entonces hice algo así:

Código Delphi [-]
    if (sen1 = 0) then begin

        AlgSent :='ascendente';
        T1:=now;
        k:=1;
        while k <=1500 do begin
          randomize;
          for i:= 1 to ult do
            a[i]:=round(random*ult);

          insercion(a,prim,ult,sen1);
          T2:=now;
          k:=k+1;
        end;

      end

      else if (sen1=1) then begin

        AlgSent :='descendente';
        T1:=now;
        k:=1;
        while k <=1500 do begin
          randomize;
          for i:= 1 to ult do
            a[i]:=round(random*ult);
          insercion(a,prim,ult,sen1);
          T2:=now;
          k:=k+1;
        end;

      end;


i,k están declaradas como integer en el mismo formulario. Inserción es un procedure, no le hagas caso al mismo solo presta atención a la lógica a ver si te sirve.


A mi me solucionó el problema pero no se cual es el error que había cometido que tuve que aplicar esta solución qu eno me parece muy buena


Un saludo desde el aquelarre


La franja horaria es GMT +2. Ahora son las 03:10:11.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi