Saltar al contenido

Cómo construir una matriz a partir de un conjunto de vectores y otras matrices usando ArrayFlatten

este problema se puede solucionar de diversas formas, por lo tanto te dejamos la respuesta más completa en nuestra opinión.

Solución:

TL;RD;

myArrayFlatten = Flatten /@ Flatten[#, 1, 3] & 

x,y,z o x,y,z se considera vector columna.

Ejemplo de uso:

v1 = 1, 2, 3; vNew = 4, 5, 6, 7, 8, 9;
v4 = 10, 11, 12; v5 = 13, 14, 15; v6 = List /@ 16, 17, 18;


 v1, vNew, v1,
 v4, v5, v6, v1,
 vNew, vNew
 // myArrayFlatten // MatrixForm

ingrese la descripción de la imagen aquí

Flatten Acercarse:

El hecho de que no esté funcionando se debe a:

En ArrayFlatten[m11, m12, ...,m21, m22, ...,...] todas las matrices m_ij en la misma fila deben tener la misma primera dimensión, y las matrices m_ij en la misma columna deben tener la misma segunda dimensión.

y

ArrayFlatten[a] es normalmente equivalente a Flatten[a,1,3,2,4]

¡No es nuestro caso “normal (ly)”! Porque funciona cuando se dice explícitamente:

blocks = v1, vNew, v4, v5, v6 // Replace[#, x_?VectorQ :> [email protected]
@x, 2] &; blocks // Flatten[#, 1, 3, 2, 4] & blocks // ArrayFlatten
1,4,5,2,6,7,3,8,9,10,13,16,11,14,17,12,15,18

ArrayFlatten[1,2,3,4,5,6,7,8,9,10,11,12,13,14,
               15,16,17,18]

Sin embargo, no siempre fallará, por ejemplo, para: v1, vNew, vNew, v6. Así que hagamos la primera voltereta y luego Map con Flattenasí que al final puedes usar:

myArrayFlatten = Flatten /@ Flatten[#, 1, 3] & 

toma automáticamente x,y,z ser vector columna.

No entiendo todo lo suficientemente bien como para publicar aquí una explicación rápida, pero un buen comienzo para obtener más información es el comando Aplanar: matriz como segundo argumento


viejo anser, trabajando pero feo

Realmente no sé por qué no es tan simple :/.

Espero no haberme perdido nada, esta función te ayudará si las dimensiones están bien. Así que no espere nada como construir una matriz de bloques.

toMatrix = Composition[

  Join @@ # &,
  Join[##, 2] & @@@ # &,
  Replace[#, x_?VectorQ :> [email protected]@x, 2] &

  ]

Replace parte es solo en caso de que alguien proporcione x,y,z listas y quiero que sean vectores de columna.

[email protected]
 vNew, vNew, v1,
 v1, v4, v1, vNew
 // MatrixForm

ingrese la descripción de la imagen aquí

Primero, una forma más sencilla de obtener su primer ejemplo:

(m = ArrayFlatten[Transpose /@ v1, v2, v3, v4, v5, v6, 1]) // MatrixForm

ingrese la descripción de la imagen aquí

Una forma alternativa de hacer @bill’s ruina truco:

(m2 = ArrayFlatten[Transpose /@ v1, ## & @@ Transpose[vNew], v4, v5, v6, 1]) // MatrixForm

ingrese la descripción de la imagen aquí

Usando ArrayReshape como alternativa a ArrayFlatten:

ArrayReshape[Transpose /@ v1, vNew, v4, v5, v6, 6, 3] // MatrixForm

ingrese la descripción de la imagen aquí

¿Qué tal simplemente romper la matriz y luego reconstruirla de la misma manera? Aquí están sus vectores fuente

v1 = 1, 2, 3; vNew = 4, 5, 6, 7, 8, 9;
v4 = 10, 11, 12; v5 = 13, 14, 15; v6 = 16, 17, 18;

Así que ahora define y reconstruye:

v2, v3 = Transpose[vNew]; 
ArrayFlatten[[email protected]v1, v2, v3, [email protected]v4, v5, v6, 1] // MatrixForm

Si quieres hacerlo todo en un solo comando:

ArrayFlatten[[email protected][Flatten[v1, [email protected]], 3], [email protected]v4, v5, v6, 1]

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *