Saltar al contenido

Guardar una matriz formateada en un archivo de texto en MATLAB

Este post debería en realidad llamarse algo así como «Cómo guardar una matriz con formato en un archivo de texto con MATLAB, y no morir en el intento».

Es muy posible que si usas MATLAB y tienes un set de datos guardados en una matriz, quieras guardar esa matriz en un fichero de texto. Esto puede servirte para cargarlos en MATLAB posteriormente, o usarlos con otro programa como puede ser Excel. Hay muchas maneras de hacer esto, pero cuando queremos guardar cada columna con un determinado formato la cosa se complica un poco. Se complica porque hay que empezar a lidiar, por un lado, con la definición del formato y, por otro lado, con las formas aveces poco lógicas de trabajar en MATLAB. Que sí, que es un software fantástico, pero aveces tiene detalles y caprichos que dan ganas de tirar la toalla con él.

Una de las formas de guardar nuestra matriz de datos en MATLAB es usar el comando fprintf. Con pfrintf puedes especificar el formato con el que quieres escribir cada columna de la matriz (puede que una columna sea un número con 4 decimales, otra sea un número entero, otra sea una cadena de texto…). Las normas para aplicar el formato deseado son las que encontrarás aquí. El caso es que, una vez escrito el formato, podrías encontrarte con una desagradable sorpresa como me ha pasado a mí, y es que siguiendo el típico ejemplo que Mathworks escribe en web o en la ayuda de MATLAB, solo consigues escribir valores de la primera columna pero ordenados en filas hasta que se acaban y comienzan a escribirse valores de la segunda columna y así sucesivamente. Voy a poner un ejemplo para que se entienda mejor lo que quiero decir:

Supongamos que tenemos un set de datos que consta de 4 columnas con 4 filas. La primera columna es temperatura dada con un decimal, la segunda es año, la tercera es mes y la cuarta es día (en estas tres últimas columnas todos los valores son enteros). Entonces, nuestra definición de formato sería algo así: formato=’%5.2f %d %d %d\n’    Tenemos 4 filas, lo que quiere decir que lo que queremos guardar es un registro de cuatro medidas de temperatura con su correspondiente fecha. Podría ser algo así:

temperatura=[10.25; 40.36; 28.50; 3.32]

agno=[2003; 2003; 2003; 2003]

mes=[12; 12; 12; 12]

dia=[25; 25; 25; 25]

datos=[temperatura, agno, mes, dia]

Muy bien, pues es muy posible que para grabar este set en un fichero y con el formato que queremos probemos con esto:

formato=’%5.2f %d %d %d\n’

fid=fopen(‘ficherodatos.txt’,’w’);

fprintf(fid,formato,datos);

fclose(fid);

————–

La \n es para empezar a escribir en una nueva línea tras escribir los primeros valores de cada columna. %d es para escribir números enteros, y el %5.2f lo hemos puesto para escribir la temperatura con dos decimalos. El 5 en %5.2 significa que pueden haber 5 caracteres de texto en total, contando la parte entera, el punto y los dos decimales.

La desagradable sorpresa es que fichero de texto que se ha grabado tiene esta pinta:

Fichero de texto MATLAB

Como ves, ha escrito cuatro columnas pero con los valores de la temperatura primero, luego los años, luego mes y finalmente día, eso sí, con el formato que le pedimos. Pero no es el orden en el que queremos los datos!

La solución es escribir un pequeño código con un sencillo loop, como este:

fid=fopen(‘ficherodatos.txt’,‘wt’);




formato=’%5.2f %d %d %d\n’ ;

for i=1:size(datos,1);

    fprintf(fid,formato,datos(i,:));

end

fclose(fid)

Ahora sí, si abrimos el fichero de texto resultante nos encontramos con esto:

Archivo de texto MATLAB

Esto sí es justo lo que queríamos. En el código de arriba verás que en la instrucción fid he puesto ‘wt’ en vez del ‘w’ que teníamos al principio. Esto es para indicarle que queremos escribir en un fichero que es un fichero de texto y que debe adaptarse a las directrices seguidas por los ficheros de texto en el sistema operativo donde estés ejecutando este código. Esto puede interesarte o no. Lo que he hecho es comprobar cuáles son las dimensiones de la matriz datos y hacer un loop desde 1 hasta el número de datos en cada columna (esto es, el número de filas). Dentro del loop he ordenado a MATLAB que escriba las filas de la matriz datos, una a una, en el archivo ficherodatos.txt con el formato deseado.

Ahí queda este tip por si lo necesitas en algún momento. A mí además me sirve escribirlo aquí para no perder estos apuntes entre cientos de papeles. 🙂

Publicado enDivulgación

9 comentarios

  1. Jheyns Arciria Jheyns Arciria

    gracias por la información estoy trabajando ya hace algunos meses con matlab y como en algunas ocasiones las necesidades te hacen aprender cosas buenas XD, saludos…!!

  2. José José

    Hola quisiera saber como se puede hacer una matriz alphanumerica y almacenarla en un archivo de acceso directo. Gracias

  3. Christian Christian

    Se siguen respondiendo preguntas pese al paso del tiempo?
    En caso de ser así, haré la mia.
    Yo tengo que guardar tres variables en un archivo txt: el formato sería el siguiente:
    V1_1, V2_1, V3_1
    V1_2, V2_2, V3_2
    V1_3, V2_3, V3_3
    V1_4 V2_4, V3_4
    …………..
    Problemas con la cantidad de veces que se repita no tengo, lo recorro con un ciclo for ya que conozco su longitud.
    Mi problema está en una de las variables, que puede tener distinta cantidad de elementos, por ejemplo:

    V3_1= -58.6332 -37.6145 -58.6325 -37.6150 -58.1000 -37.2000 -58.3000 -37.4000

    V3_2= -58.6325 -37.6150 -58.6319 -37.6156

    La línea que uso es la siguiente:

    fid=fopen(‘Resultado.txt’,’w’);
    for i=1:aux1
    fprintf(fid,’%6.0f,%4.2f;%3.5f;%3.5f;%3.5f;%3.5f;%3.5f;%3.5f;%3.5f;%3.5f\r\n’,V1(i),V2(i),V3i});
    end
    fclose(fid);

    Claramente es algo horrible el tema de repetir tantas veces esa forma de escribir la variable, pero no se como!
    Alguna ayuda??

    Gracias, tu blog es super recomendable!

  4. Diego Diego

    Hola! Qué bueno encontrar tu blog!
    Tengo una duda con este post: Se quiere guardar una matriz 3D en un archivo o es en realidad una matriz 2D o arreglo?
    Gracias! Saludos desde Argentina!
    Diego

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