** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Combinar varias matrices 1d en una 2d
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoCombinar varias matrices 1d en una 2d

 Responder Responder
Autor
Mensaje
Adrianet Ver desplegable
Habitual
Habitual
Avatar

Unido: 26/Marzo/2015
Localización: Valencia
Estado: Sin conexión
Puntos: 135
Enlace directo a este mensaje Tema: Combinar varias matrices 1d en una 2d
    Enviado: 16/Enero/2023 a las 11:36
Hola amigos del foro,

Este post es una forma de dar respuesta a un tema que quedó pendiente para mí, que era pasar una matriz 1D de 20 elementos, a otra matriz 2D de tamaño 5 x 4  ( 1 to 5, 1 to 4), donde visualizamos la composición de un campeonato de futbol, con 6 equipos, obteniendo 5 jornadas de grupos, con el numero de jornada y 3 parejas (o partidos)

Ejemplo de elementos para la primera jornada:   1   ab  cd  ef     (4 elementos)


Este procedimiento que pego a continuación, se intenta dar una respuesta, y he tomado como ejemplo un caso más simple, con 4 equipos, y tres jornadas para sus emparejamientos (6 parejas)

El objetivo, entonces es:   Combinar tres matrices 1D en una matriz 2D.

Private Sub CombinarArr1d_Arr2d_Click()

‘ dividimos una matriz 1D en tres partes, y luego combinamos las tres matrices en otra matriz 2D

Dim miArray() As String

ReDim miArray(1 To 9)

miArray(1) = "1"

miArray(2) = "ab"

miArray(3) = "cd"

miArray(4) = "2"

miArray(5) = "ac"

miArray(6) = "bd"

miArray(7) = "3"

miArray(8) = "ad"

miArray(9) = "bc"


'dividimos la matriz en tres partes, de tres elementos cada una

Dim nelem As Integer

nelem = 3

 

Dim arr1() As String

Dim arr2() As String

Dim arr3() As String

ReDim arr1(1 To 3)

ReDim arr2(1 To 3)

ReDim arr3(1 To 3)

 

 

For i = 1 To nelem

   arr1(i) = miArray(i)

Next i


For j = 1 To nelem

   arr2(j) = miArray(nelem + j)

Next j

 

For k = 1 To nelem

   arr3(k) = miArray(nelem * 2 + k)

Next k

 

'vemos las tres matrices

For n = 1 To 3

  ms1 = ms1 & arr1(n) & vbTab

Next n

MsgBox ms1, , "valores en primera matriz"          'obtenemos: 1  ab  cd

 

For n = 1 To 3

  ms2 = ms2 & arr2(n) & vbTab

Next n

MsgBox ms2, , "valores en segunda matriz"        'obtenemos: 2  ac  bd

 

For n = 1 To 3

  ms3 = ms3 & arr3(n) & vbTab

Next n

MsgBox ms3, , "valores en tercera matriz"          'obtenemos: 3  ad  bc

 

'pasamos las tres matrices a una matriz 2d

'asignamos las variables de filas y columnas

ifilas = 3

icolumnas = 3

 

Dim arrayfinal() As String

ReDim arrayfinal(1 To 3, 1 To 3)

 

For iFila = 1 To ifilas

    For jcol = 1 To icolumnas

        If iFila = 1 Then

           arrayfinal(iFila, jcol) = arr1(jcol)

        End If

       

        If iFila = 2 Then

           arrayfinal(iFila, jcol) = arr2(jcol)

        End If

 

        If iFila = 3 Then

           arrayfinal(iFila, jcol) = arr3(jcol)

        End If

    Next jcol

Next iFila

 

'mostramos los resultados

For x = 1 To ifilas

   For y = 1 To icolumnas

      ms = ms & arrayfinal(x, y) & vbTab

   Next y

   ms = ms & vbNewLine

Next x

MsgBox ms, , "resultado final, obtenemos una matriz 2d"

 

'obtenemos :         1  ab  cd

'                                2  ac  bd

'                                3  ad  bc

 

End Sub

 

 

El procedimiento funciona bien y obtiene el resultado deseado, pero quería plantear la siguiente cuestión :

1.- he utilizado una forma de pasar las tres matrices 1d a la matriz final 2d que es muy simple porque sólo hay tres matrices, o sea tres filas para la matriz final. Para ello utilizo tres IF … ENDIF, uno por cada matriz.

¿ existe otra forma de hacerlo, y que sea aplicable para indeterminadas matrices 1d, es decir para n matrices 1d?

Saludos a todos,

Adrian.


 


Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 1510
Enlace directo a este mensaje Enviado: 16/Enero/2023 a las 20:13
Puedes crear una función que reciba todas las matrices 1-d que quieras, y que las convierta en una matriz 2-d. Puede ser algo así, que podrás mejorar, ya que no tengo en cuenta que las matrices tengan distinta cantidad de elementos, o que el primer elemento no esté en la base 0, o es posible que haya por ahí algún error no detectado todavía.


Public Function UnirMatrices(ParamArray matrices())

    Dim matriz()        'Matriz donde se van a incorporar las pasadas como argumentos
    Dim fila As Long    'Contador de filas
    Dim col As Long     'Contador de columnas
       
    'Sólo agregamos los parámetros (matrices 1-d) a la matriz final, si nos han pasado algo
    If Not IsMissing(matrices) Then
        'Redimensionamos la matriz: filas = número de matrices pasadas, columnas = número de elementos en la primera matriz pasada
        ReDim matriz(UBound(matrices), UBound(matrices(0)))
       
        'Ahora recorremos las filas y columnas: podemos usar LBound(matrices) y LBound(matrices(0)) en vez de 0 como primer elemento
        'de la matriz, en caso de que sea posible que hayan modificado el índice más bajo (1 en vez de 0, por ejemplo)
        'For fila = LBound(matrices) To UBound(matrices)
        For fila = 0 To UBound(matrices)
            'For col = LBound(matrices(0)) To UBound(matrices(0))
            For col = 0 To UBound(matrices(0))
               'Aquí le asignamos el valor a la matriz de 2 dimensiones. La parte de la izquierda es fácil, posición en la matriz dada
               'por la fila y la columna. La parte de la derecha es más "divertida": posición en la matriz que está dentro de la otra
               'matriz o ParamArray
               matriz(fila, col) = matrices(fila)(col)
            Next
        Next
    End If
    
    'Y devolvemos la matriz de 2 dimensiones creada, o una matriz no inicializada.
    'Como todo está "declarado" como Variant, este tipo de datos admite de todo
    UnirMatrices = matriz
End Function


Función para probar la unión de matrices:


Function prueba()

    Dim fila1(4)
    Dim fila2(4)
    Dim fila3(4)
    Dim final
    Dim fila As Long
    Dim col As Long
    
    fila1(0) = 1
    fila1(1) = 2
    fila1(2) = 3
    fila1(3) = 4
    fila1(4) = 5
    
    fila2(0) = "a"
    fila2(1) = "b"
    fila2(2) = "c"
    fila2(3) = "d"
    fila2(4) = "e"

    fila3(0) = #1/1/2023#
    fila3(1) = #1/2/2023#
    fila3(2) = #1/3/2023#
    fila3(3) = #1/4/2023#
    fila3(4) = #1/5/2023#
    
    final = UnirMatrices(fila1, fila2, fila3)
    
    For fila = 0 To UBound(final, 1)
        Debug.Print "Fila " & fila & ": ";
        For col = 0 To UBound(final, 2)
            Debug.Print final(fila, col); " - ";
        Next
        Debug.Print
    Next
End Function
Arriba
Adrianet Ver desplegable
Habitual
Habitual
Avatar

Unido: 26/Marzo/2015
Localización: Valencia
Estado: Sin conexión
Puntos: 135
Enlace directo a este mensaje Enviado: 17/Enero/2023 a las 11:17
Hola Pitxiku, gracia por tu respuesta.
He probado tu código y funciona perfectamente en tu ejemplo de tres matrices. (con base cero)

Pero, he aplicado tu función a mis tres matrices, con base 1, y me ha dado error de subindice fuera del intervalo -->  supongo que será porque mis matrices estan en base 1

en esta línea -->   matriz(fila, col) = matrices(fila)(col)
da el error


he probado cambiado, cambiando el ubound(matrices(0)))   -->  a ubound(matrices(1)))

ReDim matriz(UBound(matrices), UBound(matrices(1)))
       
     
    For fila = 0 To UBound(matrices)
         'For col = LBound(matrices(0)) To UBound(matrices(0))
      For col = 0 To UBound(matrices(1))   ' aquí cambio también el cero por el uno


también cambio el indice inferior para ver la matriz final,, en lugar de for fila = 0,
pongo for fila = 1 to ...

pero al final no me muestra la primera matriz, es decir sale como resultado:
                2  ac  bd
                3  ad  bc


en lugar de:    1  ab  cd
                2  ac  bd
                3  ad  bc

seguramente, el error está fácil de corregir, pero no consigo ver dónde.

Saludos, y muchas gracias por tu respuesta, ...
Adrian

Arriba
Adrianet Ver desplegable
Habitual
Habitual
Avatar

Unido: 26/Marzo/2015
Localización: Valencia
Estado: Sin conexión
Puntos: 135
Enlace directo a este mensaje Enviado: 17/Enero/2023 a las 15:46
Hola, Pitxiku

Después de revisar de nuevo tu código, veo que es totalmente aplicable para los casos de matrices con base 0 o con base 1, ... (como indicas en tus comentarios... )
y es que a veces lo evidente está tan claro que no lo vemos si no nos detenemos a "leer"

pues bien, el código que hace funcionar la combinación de mis tres matrices con base 1 sería usar estos bucles, como indicas en tu función, ... añado el comentario  ' para base x según el caso 

'  bucles que se aplican a las matrices con base 1 o para base 0

         For fila = LBound(matrices) To UBound(matrices)                     ' para base 1

 '  For fila = 0 To UBound(matrices)                                 ' para base 0

              For col = LBound(matrices(0)) To UBound(matrices(0))         ' para base 1

 '  For col = 0 To UBound(matrices(0))                           ' para base 0

 'Aquí le asignamos el valor a la matriz de 2 dimensiones. La parte de la izquierda es fácil, posición en la matriz dada

 'por la fila y la columna. La parte de la derecha es más "divertida": posición en la matriz que está dentro de la otra

                'matriz o ParamArray

                matriz(fila, col) = matrices(fila)(col)

            Next col

        Next fila

' * * * * *

Por todo lo cual, decirte que tu código es perfecto para el propósito de la combinación de matrices 1d en otra matriz 2d. Y por mi parte, tendré que profundizar en el uso de ParamArray y aprender más sobre el tema de matriz de matrices.

Gracias por tu ayuda, y por mi parte, si no hay comentarios o sugerencias que añadir, se puede cerrar el hilo.

saludos a todos,

Adrian.



 

 


Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable