2012-04-25 30 views
14

Me gustaría entrelazar dos vectores en MATLAB. De hecho, en realidad me gustaría agregar un cero entre cada elemento, pero pensé que haría la pregunta de tal manera que aprendería cómo aplicar esto a otras situaciones.Interweaving vectores

Mi aplicación específica: Me gustaría tomar un vector (por ejemplo [1 2 3]) y salida [0 1 0 2 0 3].

La pregunta más amplia: ¿Cómo puedo hacer esto con dos vectores diferentes, p. [1 2 3] y [9 8 7] entrelazados para producir [9 1 8 2 7 3].

Cualquier ayuda muy apreciada, en una o ambas de las preguntas anteriores.

Respuesta

8

Aquí hay un código que logre lo que quiere:

nums = rand(1,3) 
output = zeros(1,2*numel(nums)); 
output(2:2:end) = nums 

La salida es la siguiente:

nums = 

    0.9134 0.6324 0.0975 


output = 

     0 0.9134   0 0.6324   0 0.0975 

Siguiendo el estilo de las otras dos respuestas , puede obtener la salida de ceros deseada con lo siguiente:

nums = rand(1,3); 
reshape([zeros(size(nums));nums],1,[]) 

Obviamente, nums debe reemplazarse por el vector que desea utilizar. Como se mencionó, debe asegurarse de que sea un vector de fila antes de llamar al reshape.

+1

Para garantizar que sea un vector de fila, puede escribir ' nums (:) '' – Jonas

+0

¡La solución' reshape' es muy elegante! – Anael

10

Trate

reshape([[9 8 7];[1 2 3]],1,[]) 
+0

Me gusta mucho esta solución, pero mirando la documentación, no veo ninguna garantía de que esta función se comporte de esta manera para todas las entradas, o para futuras implementaciones de la función. En particular, parece garantizar únicamente que: "reshape (X, SIZ) devuelve una matriz N-D con los mismos elementos que X, pero modificada al tamaño SIZ". –

+0

@JacobLee: Ese uso de 'reshape' es seguro de usar. El primer argumento es una matriz, después de un 1 y un portaherramientas siempre cambia a 1xn. – Daniel

+0

Una versión más general que funciona para las entradas de fila y columna sería 'remodelar ([A (:). '; B (:).'], 1, [])' – Daniel

25

Haría uso del diseño interno de los vectores MATLAB: se almacenan en la columna principal, es decir, los valores en una columna cambian más rápido. Para intercalar dos vectores a y b, simplemente hacer:

ar = a(:)'; % make sure ar is a row vector 
br = b(:)'; % make sure br is a row vector 
A = [ar;br]; % concatenate them vertically 
c = A(:);  % flatten the result 
+0

Trivial, pero para que devuelva un vector de fila, por supuesto, puede cambiar la última línea como sigue: 'c = A (:) ';' –

+2

Use '.'' en lugar de''', de lo contrario no funcionará con números complejos. – Daniel

4

escribí una función MATLAB que está en el sitio de Intercambio de Archivos (Interleave Vectors or Matrices) que hace exactamente lo que quiere y más. Simplemente descargue el archivo .m y coloque el archivo en el mismo directorio que sus otros archivos .m, o copie y pegue la función en su programa.

Esta función intercala cualquier cantidad de vectores o matrices por fila o columna. Si la entrada es solo un vector, no es necesario especificar la orientación. Los elementos adicionales/filas/columnas se agregan al final de la matriz de salida. Las otras respuestas proporcionadas son muy específicas para vectores de igual longitud o requieren asegurarse de que la orientación de los vectores sea correcta.

Ejemplos de cómo utilizar la función:

1) intercalación filas de matrices

A = [1 2; 3 4] B = [5 6;7 8] 

C = interleave2(A, B, 'row') 
C = [1 2 
    5 6 
    3 4 
    7 8] 

2) Intercalación columnas de matrices

C = interleave2(A, B, 'col') 
C = [1 5 2 6 
    3 7 4 8] 

3) intercalado de vectores (Nota: de entrada los vectores no necesitan tener la misma orientación)

A = [1 2 3 4] B = [5 6 7 8 9]' 
C = interleave2(A, B) 
C = [1 5 2 6 3 7 4 8 9]' 

4) de entrelazado> 2 matrices

A = [1 2;3 4] B = [5 6;7 8] 
C = [9 10;11 12] D = [13 14;15 16] 

E = interleave2(A, B, C, D, 'col') 
E = [1 5 9 13 2 6 10 14 
    3 7 11 15 4 8 12 16] 

5) de intercalado columnas de 2 matrices con columnas desiguales

A = [1 2;3 4] 
B = [5 6 7 8;9 10 11 12] 
C = interleave2(A, B, 'col') 
C = [1 5 2 6 7 8 
    3 9 4 10 11 12] 

6) intercalado> 2 vectores de longitudes desiguales

A = [1 2 3 4] B = [5 6 7] 
C = [8 9 10 11 12 13] 
D = interleave2(A, B, C) 
D = [1 5 8 2 6 9 3 7 10 4 11 12 13] 
4

Para En el caso más simple hay una solución bastante "elegante" con una línea como se describe en this answer a una pregunta similar.

a = [9 8 7]; 
b = [1 2 3]; 
output = kron(a, [1 0]) + kron(b, [0 1]); 

Como se indica en la respuesta tenga en cuenta que esto es menos eficiente sin embargo podría servir para un propósito más general que sólo el entrelazado, ya que utiliza el Kronecker product que está bien definida entre dos matrices.