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
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 aFlatten[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 Flatten
así 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
Primero, una forma más sencilla de obtener su primer ejemplo:
(m = ArrayFlatten[Transpose /@ v1, v2, v3, v4, v5, v6, 1]) // MatrixForm
Una forma alternativa de hacer @bill’s ruina truco:
(m2 = ArrayFlatten[Transpose /@ v1, ## & @@ Transpose[vNew], v4, v5, v6, 1]) // MatrixForm
Usando ArrayReshape
como alternativa a ArrayFlatten
:
ArrayReshape[Transpose /@ v1, vNew, v4, v5, v6, 6, 3] // MatrixForm
¿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]