[RESUELTO] ¿Como encontrar el valor máximo de una matriz?

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...

[RESUELTO] ¿Como encontrar el valor máximo de una matriz?

Notapor valenteres » Sab Ene 23, 2016 7:49 pm

Buenas tardes:

En un código he definido una variable como matriz. En el proceso de cálculo se asignan valores da los diferentes elementos de la matraz.
Necesito encontrar el los valores máximo y mínimo.

He visto que para los rangos hay funciones específicas. Las funciones:

Código: Seleccionar todo   Expandir vistaContraer vista
Minimo = Rango.ComputeFunction(com.sun.star.sheet.GeneralFunction.MIN)
Maximo = Rango.ComputeFunction(com.sun.star.sheet.GeneralFunction.MAX)

Proporcionan los valores mínimo y máximo del rango. He probado a sustituir Rango por la matriz y no ha funcionado.

¿Hay un equivalente para matrices?

Muchas gracias
Última edición por valenteres el Lun Ene 25, 2016 11:04 am, editado 1 vez en total
-------------------------------------------------------------
"Como no sabían que era imposible, lo hicieron"

Open Office 4.1.1
Libre Office 5.0
Windows 10
-------------------------------------------------------------
valenteres
 
Mensajes: 81
Registrado: Mié Jun 17, 2015 6:04 pm

Re: ¿Como encontrar el valor máximo de una matriz?

Notapor xiseme » Sab Ene 23, 2016 8:49 pm

Supongo que no quieres recorrer los elementos de la matriz en un bucle For-next
... En el proceso de cálculo se asignan valores da los diferentes elementos de la matraz ...
Me pregunto si no es posible tener un Vmax y Vmin (variables) que capturen ese máx-mín al asignar los valores.
Todo es mejorable, estamos dispuestos a mejorar. ¿Yo? ... poco a poco.
Nunca hay acritud en mis comentarios, si lo pareciera, seguro que me he expresado mal.
xiseme
 
Mensajes: 1896
Registrado: Lun Nov 24, 2008 1:13 pm

Re: ¿Como encontrar el valor máximo de una matriz?

Notapor mauricio » Sab Ene 23, 2016 9:03 pm

______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
mauricio
 
Mensajes: 6062
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX

Re: ¿Como encontrar el valor máximo de una matriz?

Notapor valenteres » Sab Ene 23, 2016 11:27 pm

Buenas tardes de nuevo:

Una alegría verte por aquí Mauricio.
Tus indicaciones, como siempre, han sido acertadas y ha funcionado.

He generado una matriz "normal" y el código ha funcionado correctamente.
La matriz origen de datos corresponde a una variable personalizada.
Código: Seleccionar todo   Expandir vistaContraer vista
Type TEstad
   Num As Long      'Número de datos
   Med As Double   'Valor medio
   Max As Double   'Valor máximo
   Min As Double   'Valor mínimo
   Des as Double   'Desviación estandar de la muestra
End Type

Type TSerie      'Parámetros necesarios para definir la serie
   ....
   EstX as New TEstad   'Estdísticos de los valores X
   EstY as New TEstad   'Estdísticos de los valores Y
   EstY2 as New TEstad   'Estdísticos de los valores Y secundario
   ....
End Type


Con los valores máximos genero una nueva matriz:
Código: Seleccionar todo   Expandir vistaContraer vista
For Co1 = 0 to Ubound(GSerie())
   MatAux(Co1)=GSerie(Co1).EstX.Max
Next Co1


Si aplico el procedimiento a la matriz MatAux funciona adecuadamente
Código: Seleccionar todo   Expandir vistaContraer vista
util.msgbox(util.max(MatAux))

Maximo=util.max(util.max(MatAux))
MsgBox Maximo


Cuando sustituyo MatAux por la original GSerie(Co1).EstX.Max:
Código: Seleccionar todo   Expandir vistaContraer vista
util.msgbox(util.max(GSerie.EstX.Max)

Presenta el siguiente error
Matrices.png
Error al utilizar variable personalizada como matriz


Si se puede utilizar la matriz original (supongo que sí), se simplifica el código.

Muchas gracias u un saludo
-------------------------------------------------------------
"Como no sabían que era imposible, lo hicieron"

Open Office 4.1.1
Libre Office 5.0
Windows 10
-------------------------------------------------------------
valenteres
 
Mensajes: 81
Registrado: Mié Jun 17, 2015 6:04 pm

Re: ¿Como encontrar el valor máximo de una matriz?

Notapor mauricio » Dom Ene 24, 2016 4:43 am

Es lógico, según veo, en GSerie(Co1).EstX.Max, tienes un valor flotante, el método max requiere una matriz, lo dice claramente el error mostrado...

lo siguiente debe de funcionar...
Código: Seleccionar todo   Expandir vistaContraer vista
    util.msgbox(util.max(Array(GSerie.EstX.Max)))

pero... ¿para que quieres el valor máximo de un solo valor?... seguramente me estoy perdiendo de algo más que tienes y no lo veo o no lo pusiste, pero... MAX con EasyDev siempre te devolverá el máximo de una matriz de valores...

Manejar matrices con Python es una delicia, como pueden ver aquí: http://easydev.readthedocs.org/en/latest/arrays.html
y casi todo disponible ahora desde Basic (u otros lenguajes de macros) por medio de EasDev...

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
mauricio
 
Mensajes: 6062
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX

Re: ¿Como encontrar el valor máximo de una matriz?

Notapor valenteres » Dom Ene 24, 2016 8:14 pm

Buenas tardes:

Tuve un error por un corta-pega de código, pero desafortunadamente el resultado es el mismo.
Una matriz "normal" funciona sin problemas, pero la matriz generada con un tipo personalizado de variable, da error de variable de objeto no establecida.

El código utilizado es el siguiente:
Código: Seleccionar todo   Expandir vistaContraer vista
Sub EscEjes(ESerie() As Object)

Dim Minimo As Double
Dim Maximo As Double
Dim Co1 as integer
Dim nSer as integer
Dim util as Object

Dim MatAux()

Redim MatAux(Ubound(ESerie()))

util = createUnoService("org.universolibre.EasyDev")

For Co1 = 0 to Ubound(ESerie())
   MatAux(Co1)=ESerie(Co1).EstX.Max
Next Co1

Maximo=util.max(MatAux)
MsgBox Maximo

util.msgbox(util.max(MatAux))

'a=Array(ESerie.EstX.Max)
'a=Array(ESerie().EstX.Max)
'util.msgbox(util.max(Array(ESerie.EstX.Max)))
util.msgbox(util.max(ESerie.EstX.Max))
End Sub

La matriz ESerie corresponde a un tipo personalizado de variable
Con el lazo For - Next paso un componente de esa variable a una matriz auxiliar
Cuando utilizo la matriz auxiliar funciona sin problemas
Cuando utilizo la matriz ESerie da el siguiente error:
Matrices01.png
Error con Matrices

Las instrucciones que están comentadas con comilla, dan todas el error indicado en la imagen

La estructura de la variable personalizada es la siguiente:
Código: Seleccionar todo   Expandir vistaContraer vista
Type TEstad
   Num As Long      'Número de datos
   Med As Double   'Valor medio
   Max As Double   'Valor máximo
   Min As Double   'Valor mínimo
   Des as Double   'Desviación estandar de la muestra
End Type

Type TSerie      'Parámetros necesarios para definir la serie
   Doc as Object   'Documento en el que están los datos de la serie
   Hoja as Integer   'Hoja en el que están los datos de la serie
   ColX as Integer   'Columna en la que están los datos de las abscisas (x)
   Coly as Integer   'Columna en la que están los datos de las ordenadas (y)
   FilA as Long   'Primera Fila con datos
   FilZ as Long   'Última Fila con datos
   FilT as Long   'Fila con el título de la serie
   EstX as New TEstad   'Estdísticos de los valores X
   EstY as New TEstad   'Estdísticos de los valores Y
   EstY2 as New TEstad   'Estdísticos de los valores Y secundario
   EjeY as Integer      'En el caso del eje Y: =0 Eje principal, =1 eje secundario
   FacEsc as Single   'Factor escala con respecto a la serie de referenicia: Intervalo inicial de la Serie(0)
   IndSol as Single   'Indice de solapamiento con la Serie(0).  Sirve para separar el trazado de dos series
                  'Pueden estar en el mismo o diferente ejeY que la serie(0)
                  'El valor asignado corresponde al % de solapamiento con la serie(0)
                  'El valor varía entre 0-100
                  '   
   FTxt as Integer   'Formato de la serie      
End Type

El objetivo final es controlar los parámetros de escala de los ejes del gráfico.
Esa variable personalizad tiene los parámetros correspondientes a las series. Por una parte los datos que definen los rangos de datos y por otra parte los dato de interés, por ejemplo los valores máximos y mínimos de cada intervalo

Pretendo obtener los valores máximo y mínimo correspondientes a cada eje, teniendo en cuenta los intervalos de las diferentes series a las que se asigna ese eje.
En este caso tengo dos series con los datos en ESerie(0) y ESerie(1)
Los valores Minimos de cada serie correspondientes al eje X están en:

ESerie(0).EjeX.Min
ESerie(1).EjeX.Min

Me interesa obtener el valor mínimo de los dos, y en el caso de n series en el mínimo de los valores ESerie(0-n).EjeX.Min
Los mismo ocurre con los valores máximos

En el caso de utilizar un eje Y secundario, me interesa "sincronizarlo" con el eje Y principal, de forma que la rejilla del eje Y coincida con la rejilla del eje Y2. Para ello necesito conocer los valores extremos de uno y otro de la misma forma que he indicado en el caso del eje X

Muchas gracias
-------------------------------------------------------------
"Como no sabían que era imposible, lo hicieron"

Open Office 4.1.1
Libre Office 5.0
Windows 10
-------------------------------------------------------------
valenteres
 
Mensajes: 81
Registrado: Mié Jun 17, 2015 6:04 pm

Re: ¿Como encontrar el valor máximo de una matriz?

Notapor mauricio » Dom Ene 24, 2016 10:48 pm

valenteres escribió:Una matriz "normal" funciona sin problemas, pero la matriz generada con un tipo personalizado de variable, da error de variable de objeto no establecida.
Claro, es una matriz de objetos, no una matriz de valores...

valenteres escribió:Los valores Minimos de cada serie correspondientes al eje X están en:

ESerie(0).EjeX.Min
ESerie(1).EjeX.Min

Me interesa obtener el valor mínimo de los dos,

si solo tienes dos valores a comparar, una comparación simple debe de funcionar...
valenteres escribió:Pretendo obtener los valores máximo y mínimo correspondientes a cada eje, teniendo en cuenta los intervalos de las diferentes series

Si sabes el origen de los valores, entonces obtén el máximo y el mínimo directamente de los valores origen...

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
mauricio
 
Mensajes: 6062
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX

Re: ¿Como encontrar el valor máximo de una matriz?

Notapor valenteres » Dom Ene 24, 2016 11:32 pm

Buenas tardes:

Muchas gracias Mauricio
El problema de base es si estos procedimientos pueden o no utilizarse con matrices generadas a partir de variables de tipos personalizados.
No acabo de entender la diferencia entre los dos tipos de matrices -objetos y valores-, la "normal" se ha definido como Double. La de tipo personalizado cada elemento tiene su definición.

Sobre el número de elementos a comparar, en este caso son dos, pero corresponde al número de series que se representan en el gráfico. Desde luego que está la alternativa del lazo, pero si existe en procedimiento, el código se simplifica.

Respecto a los mínimos y máximos de los ejes, es precisamente los valores que pretendo obtener, y son consecuencia de los valores de las series. Por ello necesito los valores mínimos y máximos de todas las series, para comparación entre ellos, obtener los valores extremos de los ejes.

Un saludo
-------------------------------------------------------------
"Como no sabían que era imposible, lo hicieron"

Open Office 4.1.1
Libre Office 5.0
Windows 10
-------------------------------------------------------------
valenteres
 
Mensajes: 81
Registrado: Mié Jun 17, 2015 6:04 pm

Re: ¿Como encontrar el valor máximo de una matriz?

Notapor mauricio » Lun Ene 25, 2016 3:57 am

Siento, reitero el siento... que estas confundiendo la gimnasia con la magnesia...

la función máximo opera sobre valores... siempre, reitero el siempre... ¿las variables personalizadas son valores?... respuesta, no... son objetos...

valenteres escribió:necesito los valores mínimos y máximos de todas las series, para comparación entre ellos, obtener los valores extremos de los ejes.

Reitero... los valores de las series están (supongo), en rangos de celdas, no esperes a tener los valores en las series para obtener los máximos y mínimos, obtenlos de las celdas donde tomas los datos, con las funciones de matrices con que cuenta EasyDev, es pan comido...

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
mauricio
 
Mensajes: 6062
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX

Re: ¿Como encontrar el valor máximo de una matriz?

Notapor valenteres » Lun Ene 25, 2016 11:03 am

Buenos días:

En primer lugar, mi más sincero agradecimiento a Mauricio, por su dedicación y por su paciencia.

Tomo nota de las posibilidades de cada una de las vías. Estos son los mimbres que tenemos para hacer el cesto.
Entiendo que lo mas práctico va a ser generar esa matriz auxiliar.

A modo de reflexión. Los rangos los tengo identificados. He obtenido los valores extremos de cada rango. Supongo que podría obtener el valor mínimo de varios rangos considerados conjuntamente, y de igual forma el valor máximo. Quizás lo intente. Si no encuentro solución por esta vía, seguiré con la matriz auxiliar.

Reitero, una vez más, mi mas sincero agradecimiento.

Un saludo
-------------------------------------------------------------
"Como no sabían que era imposible, lo hicieron"

Open Office 4.1.1
Libre Office 5.0
Windows 10
-------------------------------------------------------------
valenteres
 
Mensajes: 81
Registrado: Mié Jun 17, 2015 6:04 pm


Volver a Macros y API UNO

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados