Archivos de Tags: Ubuntu - Paginas 28

Código En C++ Para Calcular El Determinante Y La Inversa De Una Matriz

Hola, siguiendo mi autoaprendizaje con las librerías matemáticas os dejo un sencillo y corto programa escrito en C++ para calcular el determinante y la inversa de una matriz cualquiera. Se sobreentiende que la matriz tiene determinante no nulo para poder calcular su matriz inversa.
Para poderlo hacer he utilizado GSL, en concreto, dos órdenes que se basan sobre la descomposición LU de una matriz.
Me explico, toda matriz cuadrada, llamémosla A, se puede descomponer de la siguiente forma:

PA=LU

Siendo P una matriz permutación, L una matriz triangular inferior en la que los elementos de su diagonal principal son todos uno; y U es una matriz triangular superior. (( L porque low es inferior y U porque upper es superior, en inglés ))

Así pues utilizando GSL tenemos la función:

gsl_linalg_LU_decomp(gsl_matrix *A, gsl_permutation *p, int *signum)

la cual nos calculará la descomposición LU de una matriz cuadrada no singular (( su determinante es no nulo )) A cualquiera, utilizando para ello una matriz permutación p que irá cambiando en las sucesivas iteraciones que realice la función, al igual que la variable entera signum. signum es el signo de la permutación, el cuasl toma el valor de (-1) n, siendo n el número de intercambios de la permutación.

Una vez calculada la descomposición LU ya podremos calcular el determinante y la matriz inversa de A con las funciones:

double gsl_linalg_LU_det (gsl_matrix *LU, int signum)
gsl_linalg_LU_invert (const gsl_matrix *LU, const gsl_permutation *p, gsl_matrix *inverse)

La primera es la que nos permite calcular el determinante, pasándole LU y signum; que los hemos calculado con la función gsl_linalg_LU_decomp. Y la segunda es la que nos permite calcular la inversa de A y guardarla en inverse, que es de tipo gsl_matrix

Para poder utilizar estas funciones bastará que en la cabecera de nuestro código introduzcamos el siguiente include:

#include <gsl/gsl_linalg.h>

Yo al programa le he llamado detinv.cpp (( vosotros llamadle como queráis, pero para C cambiad .cpp por .c )) , y el código es el siguiente:

C++:
  1. #include <iostream>
  2. #include <iomanip> //La utilizo para setw(int)
  3. #include <gsl/gsl_linalg.h> //Librería gsl para calcular lo que queremos
  4.  
  5. using namespace std;  //Instrucción para no tener que escribir std::cin
  6.  
  7. int main (int argc, char **argv)
  8. {
  9. size_t i,j,m; //size_t es un tipo específico de GSL, de tipo entero
  10. // i,j son variables contador, m es el tamaño u orden de la matriz
  11. int s; // s es la variable signum de las permutaciones
  12. cout<<"\nIntroduce el orden de la matriz: ";
  13. cin>>m;
  14. // Declaramos las matrices A, p y invA de forma dinámica para así poder destruirlas
  15. // cuando acabemos con ellas y así; liberar memoria. invA es la inversa y p es
  16. // la permutación
  17. gsl_matrix * A = gsl_matrix_alloc(m,m);
  18. gsl_permutation * p = gsl_permutation_alloc(m);
  19. gsl_matrix *invA = gsl_matrix_alloc(m,m);
  20. cout<<"\nIntroduce los elementos de la matriz:"<<endl;
  21. for(i=0; i<m*m; i++)
  22. {
  23. cout<<"A("<<i+1<<")"<<"=";
  24. cin>>A->data[i];
  25. }
  26. gsl_linalg_LU_decomp (A, p, &s); //Calculo la descomposición LU
  27. gsl_linalg_LU_invert(A,p,invA)// Calculo la inversa de A y la guardo en invA
  28. // Calculamos y visualizamos por terminal el determinante de A
  29. cout<<"\ndet(A) = "<<gsl_linalg_LU_det(A, s)<<endl;
  30. // Visualizamos por terminal la inversa de A
  31. cout<<"\nLa inversa de A es:"<<endl;
  32. for(i=0; i<m; i++)
  33. {
  34. for(j=0;j<m; j++)
  35. {
  36. cout<<gsl_matrix_get(invA,i,j)<<setw(10);
  37. }
  38. cout<<endl;
  39. }
  40. // Liberamos memoria destruyendo la que ocupan A, p e invA
  41. gsl_matrix_free(A);
  42. gsl_matrix_free(invA);
  43. gsl_permutation_free(p);
  44. return(0);
  45. }

Yo lo he escrito con gedit y lo he compilado y ejecutado con las siguientes órdenes:

g++ detinv.cpp -o detinv -lgsl -lgslcblas -lm
./detinv

Ahora sólo falta que me contéis cómo os ha ido el tema, espero que a alguien le sirva de ayuda. He de decir que los resultados de la inversa vienen en forma decimal y no en fracciones, espero pronto implementar una clase para que aparezca en forma de fracciones y publicarla en el blog, hace tiempo que la hice en Windows pero me temo que la perdí.
Os aconsejo que os leáis los siguientes enlaces para entenderlo mejor:

Código En C++ Para Multiplicar Matrices

Descomposición LU en la Wikipedia

La matriz Permutación En La Wikipedia

Saludos :)

Tags: , , ,

Instalando muParser En Ubuntu

Hola, muParser son un conjunto de librerías matemáticas escritas en C++ que nos permiten a partir de la expresión de una función matemática ( por ejemplo) , la cual es de tipo string, transformarla a ByteCode para después obtener un resultado.
Para su instalación en Ubuntu (( o en cualquier Linux )) haremos lo siguiente:

  1. Descargar el fichero .tar.gz de AQUI
  2. Lo descomprimís el fichero bajado.
  3. cd muparser
  4. ./configure - -enable-shared=yes - -enable-samples=yes - -enable-debug=yes
  5. make
  6. sudo make install
  7. sudo cp /usr/local/lib/libmuparser.so.0 /usr/lib/

Para compilar vuestros programas con muParser haced:

g++ miprograma.cpp -o miprograma -lmuparser

Os dejo un programa para que podáis ver si os funciona bien

#include "/usr/local/include/muParser.h"
#include "/usr/local/include/muParserBase.h"
#include<stdio.h>

using namespace std;
using namespace mu;

#define PARSER_CONST_PI 3.141592654

// Function callback
double MyFunction(double a_fVal)
{
 return a_fVal*a_fVal;
}

// main program
int main(int argc, char** argv)
{
try
 {
 double fVal = 1;
 Parser p;
 p.DefineVar("a",fVal);
 p.DefineConst("_pi", (double)PARSER_CONST_PI);
 p.DefineFun("MyFunc", MyFunction);
 p.SetExpr("MyFunc(a)*_pi+min(10,a)");
 cout<<p.Eval()<<endl;
}
catch (Parser::exception_type &e)
{
 cout<<e.GetMsg()<<endl;
}
return 0;
}

Finalmente me queda agradecer a GEO por ayudarme en la utilización de muParser, así como en su instalación.
Os paso unos enlaces de ayuda sobre muparser

Web Oficial De muParser

muParser En doxygen

muParser En The Code Project

Si conocéis mejores enlaces de ayuda no dudéis en compartirlos!!!

Saludos

Blogged with Flock

Tags: , , ,

Edición De Video Con Mencoder en Linux

El otro día en Hache Muda le pedí a Guillermo que me dijera un comando en mencoder para poder añadir sonido a nuestros screencasts, y él hizo más que eso, escribió un post con los comandos de mencoder que más utiliza para compartirlos con todos. Yo lo único que voy ha hacer es transcribir esos comandos para tenerlos como apuntes en mi blog. Vamos allá.

Lo primero será tener instalado el paquete mencoder, el cual lo puedes hacer fácilmente desde Synaptic.

Todos lo ejemplos que figuran a continuación están hechos con la extensión .avi, pero los podéis realizar con otro tipo de extensión: .ogg, .mpg, .mpeg.... Todos los comandos se ejecutan en una sola línea.

Los nombres de vuestros ficheros de audio o video es muy importante que no contengan espacios en blanco, ni acentos, eñes o símbolos extraños, así que os aconsejo que les cambiéis el nombre antes de manipularlos.

Rotar un video en cualquier formato. Con rotate=1 lo rotará 90º en sentido horario y con rotate=2 lo rotará 90º en sentido antihorario:

mencoder -vop rotate=1 -oac pcm -ovc lavc videoOriginal.avi -o videoRotado.avi

Escalar un video en cualquier formato. Quiero que el video final sea de tamaño 320×240:
mencoder videoOriginal.mpg -ovc lavc -lavcopts vcodec=mpeg4 -vf scale=320:240 -o videoEscalado.avi

Cortar un video. Quiero que el video final sea exactamente desde el segundo 10 hasta el segundo 55.5 del video original:
mencoder videoOriginal.avi -ss 10 -endpos 55.5 -ovc copy -oac copy -o videoRecortado.avi

Convertir un video de un formato a otro. El ejemplo es para convertir un OGG en un AVI con el códec xVid:
mencoder videoOriginal.ogg -oac pcm -ovc lavc -lavcopts vcodec=xvid:mbd=2:trell:autoaspect -o videoConvertido.avi

Otra forma de hacer lo mismo es:
mencoder video.ogg -o video.avi -ovc lavc -oac
mp3lame

Añadir una pista de audio a un video. El audio en un formato que ocupa mucho (como el WAV) y lo metemos convirtiéndolo primero a MP3:
mencoder video-sinAudio.avi -o videoFinal.avi -ovc copy -oac mp3lame -audiofile audio.wav

Añadir una pista de audio en formato MP3 a un video:
mencoder video-sinAudio.avi -o video_final.avi -ovc copy -oac copy -audiofile audio.mp3

Concatenar dos o varios videos y generar uno solo (si hay más de dos será video2.avi video3.avi…):
mencoder video1.avi video2.avi -o videoFinal.avi -ovc lavc -oac mp3lame

Para convertir videos directamente al formato del iPod, usar el script ipodvidenc. Descárgalo, dale permisos de ejecución, muévelo con sudo al directorio /usr/bin y en un terminal ejecuta el comando siguiente (te creará un .mov con el mismo nombre):ipodvidenc videoOriginal.avi

Estos apuntes de mencoder los he recogido del blog de Hache Muda, en concreto de la entrada

Ejemplos de comandos de Mencoder para edición de vídeo en GNU/LINUX

Powered by ScribeFire.

Muchas gracias Guillermo por este tutorial :-)

Saludos ;-)

Page 28 of 28« First...1020...2425262728