Saltar al contenido

Cómo repetir elementos de un vector en MATLAB

Hoy descubrí una función de MATLAB hasta ahora desconocida para mí, llamada kron. El descubrimiento surgió de la necesidad de solucionar este aparentemente sencillo problema: ¿cómo repetir n veces cada uno de los elementos de un vector, de manera que se repita el primer valor, luego el segundo, y así sucesivamente?

Para verlo más claro, veámoslo con números. Supongamos que tengo un vector cuyos elementos son 1, 2, 3, 4 y 5,  y lo que quiero conseguir es un vector cuyos elementos son 1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5. Es decir, quiero repetir 4 veces cada uno de los elementos.

Para hacer esto sin necesidad de programar un bucle con un clásico for, podemos usar la función kron de esta manera:

kron(x, ones(n,1))




En el caso del ejemplo que puse arriba, habría que escribir:

>> nuestrovector=[1,2,3,4,5]

> resultado=kron(nuestrovector, ones(4,1))

>> resultadofinal=reshape(resultado,1,size(resultado,1)*size(resultado,2))

Y entonces resultado sería nuestro nuevo vector donde ya tenemos los elementos repetidos.

Kron, viene del producto de Kronecker (aquí puedes ver la documentación de Mathworks sobre esta función de MATLAB) que podemos aprovechar para solucionar nuestro problema.

Publicado enDivulgación

12 comentarios

  1. andres andres

    ES HORRIBLE YPERDI EL TIEMPO!!!!!!,

    Kronecker da UNA MATRIZ…….
    K>> kron(nuestrovector, ones(4,1))

    ans =

    1 2 3 4 5
    1 2 3 4 5
    1 2 3 4 5
    1 2 3 4 5
    por favor corrigelo, para que no pierdan el tiempo otros

    mejo

    • Siento mucho que hayas perdido el tiempo. Faltaba un paso para escribir la matriz en forma de vector, con el comando reshape:

      resultadofinal=reshape(resultado,1,size(resultado,1)*size(resultado,2))

      Actualizo la entrada. Saludos!

  2. Hola profesora Silvia, un gusto escribirle. Me llamo Noel Enrique Torres Caballero, soy ingeniero informático y me encuentro en término de una asistente para la gestión de ruido industrial. Esta herramienta la he desarrollado con el Guide de Matlab.
    El asunto es que tengo este problema. Se trata de un vector que posee ceros y unos Ej: 00011110000000101100. Posteriormente necesito generar variables con la cantidad de elementos unos que exista para después determinar la mayor. Es que lo que me hace falta es saber el segmento de unos de mayor longitud.
    vector: 0 0 0 1 1 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0
    a0 = 4
    a1 = 1
    a2 = 2
    mayor = a0
    He probado de un millón de maneras el “genvarname” y después eval pero no lo logro. Pudiera usted darme algunas ideas.
    Mil gracias de antemano.

    • Hola Noel. Muy interesante lo que estás intentando. Nunca me había enfrentado a ese problema.
      Creo que podrías partir de la identificación de los índices del vector donde la cifra cambia. Me explico:

      vector = [0 0 0 1 1 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0];
      x=find(diff([-1 vector]));

      De esto sacarás el resultado x = 1 4 8 15 16 17 19 Esos números representan el índice en el que se aparece cada número que se repite. Por ejemplo, en el primer elemento aparece el 0, en el cuarto elemento aparece por primera vez un 1, en el octavo elemento aparece otra vez un cero, en el elemento 15 aparece otra vez un 1, y así hasta el final.

      Ahora creo que sería práctico calcular la longitud de cada uno de esos segmentos a partir de lo que ya tenemos. Podemos restar los elementos que resultan en x, para tener esas longitudes:
      y=diff(x);
      de lo que va a resultar y = 3 4 7 1 1 2 Si te fijas, ahí te ha salido la longitud del primer segmento de ceros, del primer segmento de unos, del segundo segmento de ceros, etc. Ahora faltaría saber, de entre los mayores, cuál corresponde a un segmento de unos. Sin embargo, no se me ocurre como hacerlo, pero te dejo aquí la idea por si puedes completarlo tú.

      Te invito a que lo intentes completar tú porque la mejor forma de aprender a programar es intentándolo tú mismo. En todo caso, para que no tardes mucho en solucionar el problema, te adapto la solución que encontré en otra página (aquí: http://stackoverflow.com/questions/7850341/series-of-consecutive-numbers-different-lengths). Tendrías que hacer esto:

      q = diff([0 vector 0] == 1);
      v = find(q == -1) – find(q == 1);
      solucion=max(v)

      Si haces esto con el vector que pusiste de ejemplo, la solución es 4, que efectivamente es la máxima longitud de un segmento de unos.

      Espero que esto te sirva de ayuda. Saludos!

  3. Karen Karen

    Hola, he utilizado tu código con este vector tx_bs =

    ‘ 1101000110111111011001100001’ pero al momento de correr el código, me da una matriz en donde los ceros se repiten pero los unos son reemplazados por «49» o «48» y no sé a que se debe, espero que por favor me ayudes. Gracias

Deja una respuesta

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Verificado por MonsterInsights