Anuncio

Colapsar
No hay ningún anuncio todavía.

Función Matlab

Colapsar
X
 
  • Filtro
  • Hora
  • Mostrar
Borrar todo
nuevos mensajes

  • Matlab Función Matlab

    Buenas,

    Tengo que hacer un proyecto en matlab sobre calcular la energía y el calor específico de una red cristalina de átomos. Necesito una función (y se que existe, según mi prfesor) que me haga todas las posibles combinaciones de 1 y 0 de un vector determinado, dándole el número de unos y los demás espacios cero. ¿Alguna idea de qué función es?

    Gracias

  • #2
    Re: Función Matlab

    Pues no estoy seguro exactamente de cual es tu pregunta.
    Pero si lo que quieres es obtener vectores aleatorios que todas sus componentes sean 0 y 1 puedes hacer:
    r= ceil(n.*rand(100,1)) %te hace un vector cuyas componentes son numeros naturales entre 1 y n; donde (100,1) es el tamaño del vector o matriz.

    Por lo que para que las componentes sean 0 y 1 haces:
    r= ceil(2.*rand(100,1))-1

    Espero que te sirva de ayuda

    Comentario


    • #3
      Re: Función Matlab

      Hola,

      draykaler, creo que ruato no se refiere exáctamente a eso. Tú le das una función para que genere un vector aleatorio con 0s y 1s, pero según lo que entiendo en su post, él quiere todas las posibles combinaciones de 1 y 0 que se encuentran en un vector introducido por él, y no generado aleatoriamente como tú dices.

      Una posible función que se ajuste a tus necesidades es la llamada perms. Ésta te da todas las posibles permutaciones, en las filas de una matriz, de los n-elementos que componen el vector que tú introduces, en este caso de 1s y 0s.

      Como sencillo ejemplo, te dejo esto a ver si es lo que buscas:

      Código:
      v =
      
           1     1     0     0
      
      >> perms(v)
      
      ans =
      
           0     0     1     1
           0     0     1     1
           0     1     0     1
           0     1     1     0
           0     1     1     0
           0     1     0     1
           0     0     1     1
           0     0     1     1
           0     1     0     1
           0     1     1     0
           0     1     1     0
           0     1     0     1
           1     0     0     1
           1     0     1     0
           1     0     0     1
           1     0     1     0
           1     1     0     0
           1     1     0     0
           1     0     1     0
           1     0     0     1
           1     1     0     0
           1     1     0     0
           1     0     1     0
           1     0     0     1
      Fíjate pues que la matriz que resulte tendrá n! filas y n columnas. Ahora bien, también te digo que esta función tiene sus limitaciones , ya que, si recuerdo bien, la función sólo es práctica cuando n, las componentes de tu vector, no superan los 10-11 elementos (por ahí anda la cosa, no sé el número exacto).

      No sé si esta limitación intervendrá mucho en tu trabajo, pero la función puede que te sea útil. La verdad es que lo que estás haciendo suena del todo interesante, cuando lo acabes puedes enseñar el resultado, si quieres

      Saludos,
      Última edición por Cat_in_a_box; 03/06/2012, 16:33:18.
      ''No problem is too small or too trivial if we can really do something about it''
      Richard Feynman

      Comentario


      • #4
        Re: Función Matlab

        Te dejo un programa que hice hace un tiempo en C

        Código:
        #include <stdio.h> 
        #include <stdlib.h>  
        
        long long int potencia(int n,int p) {
             int i =0;
             long long int result=n;
             for (i=0;i<p-1;i++) {
                 result *=n;
             }
             return result;
         }
        
        
          void recurs(int n,char *cad) {
             cad[n-1] = '0';
             if (n == 1) printf("%s\n", cad);
             else recurs(n-1,cad);
             cad[n-1] = '1';
             if (n == 1) printf("%s\n", cad);
             else recurs(n-1,cad);
         }
        
        
          int main(int argc, char** argv) {
             printf("Número de caracteres de la cadena: ");
             int cad;
             scanf("%i",&cad);
             char *cadena = (char *) malloc (cad*sizeof(char));
             recurs(cad,cadena);
             printf("Impresas %Ld cadenas\n", potencia(2,cad));
             return 0; 
        }
        Menos mal que lo colgué en mi blog porque si no lo habría perdido... también alguien en un foro pidió algo parecido.

        La función potencia es como x^y, irrelevante. La función recurs toma dos parámetros de entrada un entero n y un puntero a cadena cad.

        Lo que hace es sacar todas las posibles variaciones de 1 y 0 tomados de n en n. Puedes probar a compilarlo para ver cómo lo hace.

        Si te fijas en la función recurs, que es la que hace el trabajo, verás que es una función recursiva muy simple, modificarla para que lo haga con un número fijo de 0 y 1 no debería ser díficil, y pasarlo a matlab tampoco.


        De todos modos, se me ocurren maneras más fáciles de hacerlo, sin pasar por el que te lo den todo hecho de usar la función perms, y es recorrer todos los lugares en los que deba haber un 1, y rellenar luego el resto con 0s. Con una función recursiva es fácil, si la función se llama por ejemplo perms (no muy original)

        Código:
        function perms(vector, n, j)
        Para cada valor i que represente el lugar del vector, la función recibe el número de 1s que debe meter: n, y la posición: j
        
        if n==0:
            rellenar con 0s el resto (se puede inicializar todo a -1) y devolver vector
        endif
        for i=j..vector.size
            vector(i) = 1;
            perms(vector, n-1, i)
        endfor
        Se ve que la función recorrerá todas las posibilidades, si no me he equivocado (espero que no)

        Un saludo.
        Última edición por xXminombreXx; 03/06/2012, 17:14:22.
        [TEX=null]\begin{pmatrix}0 & 0 \\1 & 0\end{pmatrix}[/TEX]
        [TEX=null] \frac{1}{\pi} = \frac{2\sqrt{2}}{9801} \sum^\infty_{k=0} \frac{(4k)!(1103+26390k)}{(k!)^4 396^{4k}}[/TEX]

        Comentario


        • #5
          Re: Función Matlab

          Te doy yo ya las gracias. Me ha parecido bastante ingeniosa la solución que propones, la estudiaré cuando tenga algo más de tiempo, pero tiene buena pinta
          ''No problem is too small or too trivial if we can really do something about it''
          Richard Feynman

          Comentario


          • #6
            Re: Función Matlab

            Hola, muchas gracias a todos por contestar.

            A lo que me refería es exactamente a lo explicado por Cat_in_a_box. La función perms ya la había encontrado buscando por Matlab, pero mis vectores serán de hasta 64 elementos y además hay otro problema, quiero que se trate de componentes indistinguibles. Es decir, las combinaciones

            1* 1^ 0 0
            1^ 1* 0 0

            Quiero que sean idénticas y que sólo me haga una y no las dos (que no distinga entre diferentes 1's o diferentes 0's, vaya).

            xXminombreXx en C ando bastante perdido. Estudié en Valencia (creo que tú también) y sólo dimos C en el primer cuadrimestre de primero y si todo sale bien acabo la carrera este año, así que imagínate de lo que me acuerdo
            Podrías explicar un poco mejor tu función? es que veo que rellena, pero no se dónde se hacen las permutaciones (disculpadme, soy un desastre en esto de programar)

            Saludos

            Comentario


            • #7
              Re: Función Matlab

              Yo no estudié en valencia, estoy en la complu de madrid en 1º de grado. El C me viene de fábrica xD:

              Si quieres, te dejo mi blog:

              http://whitehathacking.wordpress.com/

              Es donde tengo un par de entradas sobre recursividad, que creo que es lo que no estás pillando.

              Una función recursiva es simplemente una función que se llama a si misma, ni más ni menos, la función que dejo no hace realmente permutaciones en el sentido de cambiar cosas (en el sentido intuitivo de una permutación), simplemente recorre todas las posibilidades.

              Estos son los dos artículos que tengo escritos sobre funciones recursivas, échales un vistazo, porque entre otras cosas explico esa función, y si tienes alguna duda pregúntamelo por aquí y te la intentaré resolver. En los artículos presupongo que sabes algo de C, aunque es todo bastante teórico y poco práctico, sobr todo en el segundo, pero soy parte de un foro de informática y los que leen eso "suelen" saber ya C.

              http://whitehathacking.wordpress.com...es-recursivas/
              http://whitehathacking.wordpress.com...-recursivas-2/

              Espero que te sirva de ayuda.

              Ahora mismo estoy de finales, pero en un rato a lo mejor mañana programo la función que pides, que la he visto interesante, y si veo que no me quita mucho tiempo, la explico en otro artículo.
              Última edición por xXminombreXx; 03/06/2012, 23:24:14.
              [TEX=null]\begin{pmatrix}0 & 0 \\1 & 0\end{pmatrix}[/TEX]
              [TEX=null] \frac{1}{\pi} = \frac{2\sqrt{2}}{9801} \sum^\infty_{k=0} \frac{(4k)!(1103+26390k)}{(k!)^4 396^{4k}}[/TEX]

              Comentario


              • #8
                Re: Función Matlab

                Lo prometido es deuda. Aquí te dejo la función hecha en Matlab:

                Argumentos de entrada, el argumento vector debe ser un vector de 0 que contenga el tantos elementos como posibles lugares pueda tomar. n es el número de 1, i es usado en la recursividad de la función, al llamar a la función i debe valer 1.

                Código:
                function permutations(vector, n, i)
                %n número de 1 que meter
                %i lugar en el que empezar
                
                if n==0                %Terminar
                    vector
                    return
                end
                
                for j=i:length(vector)-(n-1)
                
                    if j == i
                        vector(j) = 1;
                    else
                        vector(j) = 1;
                        vector(j-1) = 0;
                    end
                    permutations(vector, n-1, j+1);
                
                end
                Un ejemplito:

                Código:
                octave:27> vector = zeros(1,5);
                octave:28> permutations(vector,2,1)
                Código:
                vector =
                
                   1   1   0   0   0
                
                vector =
                
                   1   0   1   0   0
                
                vector =
                
                   1   0   0   1   0
                
                vector =
                
                   1   0   0   0   1
                
                vector =
                
                   0   1   1   0   0
                
                vector =
                
                   0   1   0   1   0
                
                vector =
                
                   0   1   0   0   1
                
                vector =
                
                   0   0   1   1   0
                
                vector =
                
                   0   0   1   0   1
                
                vector =
                
                   0   0   0   1   1
                
                ~
                (END)
                Un saludo.


                EDITO: La segunda parte de lo prometido también es deuda: http://whitehathacking.wordpress.com...-recursivas-3/
                Ahí te lo intento explicar... si tienes dudas pregunta.


                EDITO:2

                He leído que vas a usar vectores de 64 elementos. El caso más grande, como comento en la entrada es de 32 unos (la mitad). Hay 2·10⁵³ posibilidades y el ventilador del ordenador me empieza a zumbar que parece que va a salir volando por la ventana... No lo veo muy viable, para menos unos sí lo hace rápido, pero en general funciona. Si pones que saque la salida a un fichero y en algún momento cortas el programa, te habrá guardado en el archivo los que ha sacado hasta el momento, pero son muchos.
                Última edición por xXminombreXx; 04/06/2012, 12:16:25.
                [TEX=null]\begin{pmatrix}0 & 0 \\1 & 0\end{pmatrix}[/TEX]
                [TEX=null] \frac{1}{\pi} = \frac{2\sqrt{2}}{9801} \sum^\infty_{k=0} \frac{(4k)!(1103+26390k)}{(k!)^4 396^{4k}}[/TEX]

                Comentario


                • #9
                  Re: Función Matlab

                  La corrijo un pelín, por aquello de la elegancia:
                  Código:
                  function permutations(vector, n, i) 
                  %n número de 1 que meter
                   %i lugar en el que empezar
                    if n==0 %Terminar
                       vector
                       return 
                  end
                  
                    for j=i:length(vector)-(n-1)
                       vector(j) = 1;
                       if j != i
                           vector(j-1) = 0;
                       end
                       permutations(vector, n-1, j+1);
                    end
                  Última edición por xXminombreXx; 06/06/2012, 17:08:40.
                  [TEX=null]\begin{pmatrix}0 & 0 \\1 & 0\end{pmatrix}[/TEX]
                  [TEX=null] \frac{1}{\pi} = \frac{2\sqrt{2}}{9801} \sum^\infty_{k=0} \frac{(4k)!(1103+26390k)}{(k!)^4 396^{4k}}[/TEX]

                  Comentario


                  • #10
                    Re: Función Matlab

                    Perdón por estos días desaparecido... los exámenes me llamaban
                    xXminombrexX eso exactamente era lo que quería, de hecho había pensado teóricamente esa misma forma de moverse los 1 para conseguir obtener todas las combinaciones, pero evidentemente de ahí a crear el código hay un paso bastante importante. Me he leido tus entradas en el blog y me ha venido perfecto, muchas gracias por iluminarme y ayudarme a aprender algo más.
                    Voy a seguir trabajando en el programa, ya os cuento y me dais opiniones y/o sugerencias!

                    Comentario


                    • #11
                      Re: Función Matlab

                      Hola a todos!
                      Me interesa mucho este tipo de funciones y concretamente quería adaptar el código de xXminombreXx para que se guarden las combinaciones en una matriz, ya que las necesito para el resto del programa. He intentado un montón de modificaciones pero no doy con la correcta... No soy muy buena en esto de la programación y, además, acabo de pasarme a Matlab. ¿Podríais ayudarme, por favor?

                      Por otra parte, si fuesen variaciones en lugar de permutaciones, sería perfecto ya!

                      ¡¡Muchas gracias por adelantado!!

                      Comentario


                      • #12
                        Re: Función Matlab

                        Escrito por Nothing to kill or die for Ver mensaje
                        Hola a todos!
                        Me interesa mucho este tipo de funciones y concretamente quería adaptar el código de xXminombreXx para que se guarden las combinaciones en una matriz, ya que las necesito para el resto del programa. He intentado un montón de modificaciones pero no doy con la correcta... No soy muy buena en esto de la programación y, además, acabo de pasarme a Matlab. ¿Podríais ayudarme, por favor?

                        Por otra parte, si fuesen variaciones en lugar de permutaciones, sería perfecto ya!

                        ¡¡Muchas gracias por adelantado!!
                        Hola, bienvenida.

                        Para no saturar este hilo que data del año 2012 y por una cuestión de comodidad y organización, te invito a abrir un nuevo hilo y comentar en el mismo lo que querés realizar.

                        Un abrazo.-

                        Comentario


                        • #13
                          Re: Función Matlab

                          Escrito por Marce_ Ver mensaje
                          Hola, bienvenida.

                          Para no saturar este hilo que data del año 2012 y por una cuestión de comodidad y organización, te invito a abrir un nuevo hilo y comentar en el mismo lo que querés realizar.

                          Un abrazo.-
                          Vaya... No encuentro como hacerlo... Es que soy nueva en esto de los foros... ¿Podrías indicarme por favor?

                          Comentario


                          • #14
                            Re: Función Matlab

                            Como no!. Este hilo creado por [Beto] evacuará todas tus dudas.

                            Comentario

                            Contenido relacionado

                            Colapsar

                            Trabajando...
                            X