El hilo de MATLAB

gonya707

MatLAB (matrix laboratory) es un software y lenguaje de programación interpretado usado día a día por miles de ingenieros, matemáticos y físicos, gracias a su alto nivel de integración y a la potencia de los elementos de los cuales obtuvo su nombre, las matrices.

Actualmentre en prácticamente todas las carreras de ingeniería y en ciencias puras se aprende a manejar MatLAB en alguna asignatura, y me gustaría motivar a la gente a usarlo, ya que a pesar de la mala fama que tiene en algunos sectores (especialmente el informático) sigue siendo una herramienta completísima y con una potencia de cálculo enorme.

Tanto si estas comenzando como si nunca lo habeis usado, en este hilo podemos plantear dudas y postear nuestras cosillas programadas en este lenguaje.

para que sirve esto?

Al igual que todo lenguaje de programacion (excepto c que es bastante mediocre en todo, lo cual es bueno y malo) MatLAB te soluciona con simplicidad cierto tipo de problemas, complicandote la vida en otros. Una lista muy escueta de para lo que puede servirte MatLAB es:

  • Realizar calculos matemáticos, resolver sistemas de ecuaciones gigantescos, resolver operaciones con matrices.

  • Procesar señales. Imágenes, audio video, todo son matrices desde el punto de vista informático.

  • Manejar grandes cantidades de datos, hacer estadísticas con ellos, calcular regresiones...

  • procesar datos de hojas de cálculo (estilo excel), tanto numéricos como texto.

  • generar figuras con gráficas, archivos de texto, archivos binarios, audio, imágenes,...

  • Muchos mas... cualquier cosa mínimamentre relacionada con matrices, y con ello abarco muchísimas cosas.

Adicionalmente al software básico, MATLAB incluye las llamadas toolboxes, librerias enormes dedicadas a un sector especializado, como procesado de imágenes, economía, bioingeniería...

el lenguaje MATLAB

MATLAB es un lenguaje interpretado con las ventajas e inconvenientes que ello supone. El layout por defecto del programa incluye una consola donde introducir una a una las sentencias del programa a diseñar o bien editar un archivo de texto o "script" donde se listan todas las acciones a seguir y se ejecutan secuencialmente.

Una de las cualidades de este lenguaje que suele chocar a los principiantes es el poco o inexistente uso de los bucles (while, for, etc). Debido al uso de matrices para todo, el uso de bucles no es necesario (aunque se pueden usar de todos modos)

los detalles de la sintaxis MATLAB

El lenguaje que usa MATLAB es muy similar a cualquiero otro lenguaje de propósito general u orientado a objetos. Es un lenguaje secuencial donde pueden usarse bloques condicionales, bucles, etc. No obstante tiene sus particularidades:

  • una matriz se delimita con corchetes, números de la misma linea se separan con espacios o comas y una nueva línea con punto y coma.
matriz1 = [1 4 8 3; 1 4 3 3; 2 2 9 2]

matriz1 =

 1     4     8     3
 1     4     3     3
 2     2     9     2
  • El acceso a una posicion determinada de un array se consigue con los paréntesis, y la primera posicion es 1, no 0.
matriz2 = [32 56 12 78]

matriz2 =

32    56    12    78

matriz2(2)

ans =

56
  • Uno de los operadores nativos más útiles es :, que dependiendo del contexto significa "todo", "en pasos de", o "hasta". Tambien otro operador propio es la comilla simple, usada para trasponer matrices.
a = [1:8]

a =

 1     2     3     4     5     6     7     8
 
a(:)

ans =

 1
 2
 3
 4
 5
 6
 7
 8
 
b = [0:0.2:1]

b =

     0    0.2000    0.4000    0.6000    0.8000    1.0000



  • los operadores como /, * o ^ dividen multiplican, elevan, etc las matrices desde el punto de vista del álgebra. para operar miembro por miembro se precede el operador de un punto.
m = [1 2 3 4]

m =

 1     2     3     4

n = [5; 6; 7; 8]

n =

 5
 6
 7
 8

m * n

ans =

70

o = [5 6 7 8]
	
o =

 5     6     7     8

m .* o

ans =

 5    12    21    32

  • La sintaxis de los bloques mas típicos es la siguiente
if (x == 1)
    %statement 1
    %...
    %statement n
else
    %statement 1
    %...
    %statement n
end

for i = 1:10
    x(i)= i * 2;
    
end

Por supuesto MATLAB posee infinidad de funciones nativas para prácticamente todas las operaciones posibles, siempre orientadas para matrices, claro.

sum([1 2 3 4 5])

ans =

15

mean([1 2 3 4 5])

ans =

 3

fft([1 2 3 4])

ans =

  10.0000            -2.0000 + 2.0000i  -2.0000            -2.0000 - 2.0000i

como conseguir MATLAB

La mejor solución es ser estudiante de universidad y pedir a mathworks una licencia de estudiante. El precio estandar 'creo' que son $500, por lo que tenerlo by the face es un detalle a tener en cuenta.

Adicionalmente la version 7.0 esta abandonada y puede descargarse en multitud de sitios, solo pesa 20mb y posee un paquete generoso de funciones.

Una aplicacion de todo esto

Esto es un ejemplo de la típica aplicación que resulta perfecta para MATLAB. Es un conversor de cualquier imagen a Hama Beads. Se escanean los colores de cada pixel y se decide el color del catálogo de Hama Beads más parecido. El programa calcula las imagenes con dither y sin dither, y te presenta como resultado las imagenes con colores Hama beads y la lista de la compra. Adicionalmente puede sacarte mini imagenes previas con el numero de color superpuesto si la imagen es muy grande para poder ir haciendola por partes.

spoiler

Si a alguien le interesa los codigos, puede bajarlos aqui: http://puu.sh/6A7ui.rar

12
Jastro

Increible, estoy seguro que Duronman va a ser muy feliz.

1 respuesta
B

#2 zi jeje

Muy bien explicado como siempre #1, si puedo ayudar en cualquier cosa hice todo el código de mi PFC en MATLAB así que domino todas las chapuzas posibles xDD (o casi).

Hipnos e Itnas también dominan del tema, por cierto.

Todso

Buen curro de nuevo.

No conocía el uso de ":" usado como "todo" xD

Slowbro

Este cuatri me ha tocado usarlo para diseñar compensadores (vamos, poder utilizar rlocus y bode de una manera decente) ademas de diseñar un pequeño programa para calcular compensadores mediante el metodo de la bisectriz y cancelación (por si a alguien le interesa el tema de control).

Queria por otra parte empezar a hacer cosas básicas, y ya de paso ver que se puede conseguir si se usa junto a arduino.

Por lo demas muchas gracias por tus hilos gonya!

ArThoiD

Simulink ftw

inter

Yo llevo toda la carrera usando MatLab (Ingeniería Aeronáutica) y a base de palos y golpes, algo medio sé, encantado de poder ayudar a alguien si tiene alguna duda y puedo resolvérsela.

eisenfaust

Supongo que a uno le llamara mas la atencion si no ha tocado APL/J/K.

Alguien de aqui ha trasteado con Julia?

1 respuesta
willy_chaos

Nosotros el año pasado tuvimos que realizar un programa de deteccion de caras en imagenes.

Tengo el codigo por ahi. La verdad me parecio bastante interesante y como segun lei se puede llamar a un codigo matlab desde lenguaje C te puedes ahorrar ciertas cosas de forma sencilla.

PD: Me suscribo al hilo :)

1 respuesta
gonya707

#9 podrias darnos link a esos codigos si no es nada muy privado? Es una aplicacion muy interesante y creo que se puede aprender mucho analizandolo

1 2 respuestas
willy_chaos

#10 Es de un trabajito de la uni (por tema de Logins y tal no puedo subirlo, ya lo limpiare y os subo el trabajito entero), se hace mediante SVD (http://es.wikipedia.org/wiki/Descomposici%C3%B3n_en_valores_singulares), obviamente el codigo no es superseguro, pero te dice a quien se parece mas. Supongo que asi es como lo hacen las paginas que te dicen a quien te pareces mas xD

Aqui os pongo una imagen con

  • 1 - foto original
  • 2 - foto original pasada a SVD, se dejan las 100 primeras componentes y se reconstruye a imagen
  • 3 - foto original -> svd -> 200 primeras componentes -> se reconstruye
  • 4 - foto original -> svd -> 300 primeras componentes -> se reconstruye

El maximo de componentes era 365.


Primero debemos llenar una matriz con las fotos originales. Lo normal es pillar 10 de cada persona, con diferentes posiciones de la cara, y si lleva gafas pues con y sin gafas, contra mas fotos tengamos de las personas "autorizadas" mejor.

  • Cada foto se pasa a escala de grises.
  • Cada pixel se le asigna el color de gris que tiene (de 0 a 255)
  • Se pone cada fila de pixeles/codigo gris en columna ej : mat [[1 2][3 4] pasaria a ser [1 2 3 4] en columna... asi repetir por cada imagen que se desee añadir a la base de datos.
  • Todas esas columnas pasan a ponerse en una matriz grande, que sera nuestra base de datos de caras a probar en nuestro sistema (matriu_cares)

dades.mat - Archivo que contiene tanto la base de datos de los usuarios que estarian autorizados llamada matriu_cares (10 fotos por cada persona) y matriu_test donde hay fotos de personas que pueden estar en matriu_cares o no, en caso de que esten NO tiene porque ser la misma foto, esto seria por ejemplo para reconocer la cara de un usuario con autorizacion y dejarle pasar o no, por lo tanto, la foto no estara dentro de nuestra base de datos exactamente, pero mediante SVD podemos encontrar la que mas se parece.

spoiler

Hicimos un video, si os interesa tambien lo subo, seria una explicacion para alguien que no tiene NPI de informatica (nos lo hicieron hacer asi xD)

Respecto al porque hago ciertas cosas como la S*V creo recordar que eso eran las componentes, esto lo hicimos sobre abril del año pasado asi que ya no me acuerdo del todo al 100%.

La P que veis dentro del codigo, sirve para decir con cuantas componentes del vector nos quedamos, es una variable que o bien poniamos nosotros a mano o el programa la pedia.

Indicar que luego hay

 if ident_cares(:,id)==ident_test(1,i) 
 aciertos = aciertos+1; 
 str = ['Se encontro el ',num2str(aciertos),' acierto(s) 
para la cara nº ',num2str(i)]; 
 disp(str); 
 end 

donde ID es la cara (columna de la matriz) que nuestro programa cree que se parece mas a la que hemos probado. Para comprobarlo a nosotros nos dijeron que la matriz de test, tenia el mismo orden que la de la matriz_caras si no coincidia, entonces es que no era esa persona.

Por eso habría que retocar un poco el codigo para que funcionara si quereis hacer alguna app de reconocimiento de caras.

Tasa de aciertos en relacion a la compresion ( recortando componentes ).

Como podeis ver con 6 componentes de 365 ya reconoce casi el 100%, y si vieramos esa foto con 10 componentes , a nivel humano no podriamos reconocerla nosotros.

A la pregunta de porque con 200 componentes tiene menor tasa, basicamente contra mas componentes tenga, mas definicion tiene, para el ojo humano es bueno, pero para el SVD lo importante esta en las 10 primeras, (digamos que baja exponencialmente la importancia) la componente 1 es mucho mas importante que la componente 2, etc...

Por ello digamos que contra mas componentes le metemos, mas "mierda" le estamos pasando al SVD para comprobar y mas posibilidad hay de que pueda decidir por una erronea (de un tio que se parezca mucho)

3
1 comentario moderado
B

Gran hilo :). Yo tanto en el trabajo (tanto la propia "calculadora" de MATLAB como Simulink) como en el Máster es el programa que más uso, así que seguro que puedo ayudar con alguna ñapa :D

willy_chaos

#10 Estaria bien saber como llamar desde cualquier lenguaje a aplicacion matlab, y ponerlo en 1 para que asi fuera de vista rapida.

C, PHP, Java, etc...

Joey

Peeeero bueno!! Otro que se ha peleado mil veces con MatLab... lo último que me mandaron hacer fue un simulador de comunicaciones móviles, así que en lo que pueda ayudar, aquí estoy. :)

Grande gonya!

B

#8 Yo no, qué ventajas le ves? La verdad es que MATLAB me gusta pero a veces se me queda corto.

Idontknow

Otro por aquí que sabe de Matlab.

20 días después
S

que bien me va a venir esto para el proyecto de fin de carrera jajaja

1 respuesta
gonya707

#18 Cualquier duda que tengas estaremos encantados de ayudar;) hay muchos expertos por aqui

cambiando de tema, ayer subi el proyecto de las hama beads a github por si alguien quiere colaborar con el proyecto. Esta bajo el nombre hamaBeader, estoy ahora mismo con la interfaz gráfica y añadiendo nuevas features

10 meses después
U

Hola ;D sus comento mi situación. Tengo que entregar un trabajo de matlab para una optativa de la uni... el tema es que tengo muchas asignaturas este cuatrimestre y directamente no tengo tiempo para failear 1000 veces haciéndolo... Quisiera pediros algún trabajito sencillo que tengais echo por ahí para entregárselo, digo sencillo porque luego lo tengo que exponer :D Tiene que ser algo que haga una chorrada en plan calcularte el area y volumen de distintos elementos pidiendote algun dato o algo asi... Nada muy extenso o complejo.
Gracias vuestra atención, me podeis salvar el pellejo :D

2 respuestas
Joey

#20

¡Claro! ¿El masaje antes o después de la exposición?

U

No homo :D ¿tanto he pedido?

1 respuesta
DarkSoldier

#20 lo has recibido ya?

Joey

#22

No es que hayas pedido mucho o poco, es que son tus deberes. Además, en YouTube tienes mil cosas y por Google, ni te digo: https://www.youtube.com/watch?v=zThwU7N1B2U

1 respuesta
U

#20 no he recibido nada xD
#24 No estoy pidiendo que me hagan los deberes, simplemente que me entreguen algo que haya hecho alguien que luego editare y me estudiaré su explicación. Tengo 8 asignaturas este cuatrimestre y no me gustaría no acabar la carrera este año por una optativa... Me parece comprensible
Ayuda... :D
Lo de las areas era un ejemplo...

15 días después
U

Nadie me ama...

2 meses después
Joey

A ver si alguno por aquí me puede echar un cable con un asunto o darme alguna referencia. Estoy liado con el proyecto fin de carrera y he de simular el comportamiento de una válvula de audio en Matlab para pasarle cualquier señal de entrada (un tono, un wav, etc) y hacer un análisis en frecuencia, tiempo y todo ese rollo.

La cosa es que en el libro DAFX de Udo Zölzer viene un pequeño capitulo dedicado a la emulación de sistemas analógicos y en concreto, las válvulas. El código y tal, está subido por internet pero no lo termino de ver claro, usa lo que se llaman WDF (Wave Digital Filters) y crea así como un modelo. No se hasta que punto es legal hacer una captura del libro para enseñarlo... :regan:

Me gustaría hacer casi uno de 0 para no basarme en eso y así modelar lo que yo quiero (una 12AX7), pero estoy más perdido que el barco del arroz... Es la primera vez que trato de simular un sistema analógico en Matlab y no doy pie con bola. ¿Alguna idea/sugerencia?

2 respuestas
gonya707

#27 hombre, sea un sistema anlogico o no, tendras sus curvas caracteristicas que puedessimular digitalmente. Puedes pasarme el datasheet de esa valvula para hacer un tiento? creo qie sabria hacerlo pero me resulta dificil de expresar con palabras sin haberlo hecho de antemano xD

1 respuesta
Joey

#28

Pues la verdad es que he dicho 12AX7, pero realmente la que me interesa es la ECC83:
http://www.drtube.com/datasheets/ecc83-philips1970.pdf
http://www.drtube.com/datasheets/ecc83s-jj2003.pdf

Las curvas creo que se podrían modelar siguiendo las ecuaciones y tal, y luego pues me faltaría saber pasar el circuito de pequeña señal a Matlab... ahora mismo no veo nada claro, vaya follón tengo XD

1 respuesta
gonya707

#29 bueno he estado haciendo algo. Tengo mis conocimientos sobre valvulas bastante oxidados pero si mal no recuerdo la tónica es similar a transistores, sacando corrientes de salida en función de tensiones de entrada. Hasta ahi bien, luego las curvas cambian segun la alta tension con las que se alimenta.

Lo que he hecho es traspasar una de esas curvas al matlab, y hacer una funcion que devuelva el valor de corriente dentro de esa funcion.

Del mismo modo se pueden plotear las otras curvas, pero /pereza xD

puedes sacar la curva con unos cuantos puntos e interpolando, el resultado es decente, el interpolador de matlab es muy bueno

clear;
clc;
close all;

x = [0, 0.02, 0.18, 0.51, 1.18, 2.18, 3.25, 4.50, 5.75];

y = interp(x, 5);
y = y(1 : end - 4);

t = -4 : 0.1 : 0;

plot(t, y);
grid;
1 respuesta

Usuarios habituales