Programación Específica > Matlab

 Crear y leer fichero

<< < (2/4) > >>

Geo:
Deberías leer un poco la documentación de MATLAB; indicar algunos detalles de qué es lo que deseas hacer, por ejemplo ¿planeas leer el archivo desde otro programa ajeno a MATLAB? Y por último, no crear tantas discusiones sobre un mismo problema :P.

Vamos a ver, suponiendo que queremos escribir estos datos a un archivo:
matriz = [ 1 2 3; 4 5 6; 7 8 9 ];
cabecera = 'Esta es mi cabecera';

save
Si quieres usar archivos .mat, esta es la opción más sencilla de conseguir lo que quieres. Una vez que las variables están en el workspace, las guardas:

--- Código: Text --- % Variablesmatriz = [ 1 2 3; 4 5 6; 7 8 9 ];cabecera = 'Esta es mi cabecera'; % Guarda a archivo .matsave( 'archivo.mat', 'cabecera', 'matriz );  También puedes usar la función save de esta forma:

--- Código: Text ---% Guarda a archivo .matsave archivo.mat cabecera matriz 
Con eso trabajas perfectamente, lo único que te recomiendo, si piensas leer el archivo desde MATLAB, no guardar en formato ASCII (con el parámetro -ascii), porque al momento de querer cargar las variables te dará error de que no corresponden las dimensiones (el número de columnas de cada variable).
Por tanto, si piensas leer el archivo desde el mismo MATLAB lo mejor es que  guardes en formato MAT.

fprintf y otras funciones de creación de archivos
Por ejemplo, con la función csvwrite (guarda una matriz a un archivo de texto donde cada valor está separado por comas) no puedes escribir unos datos y posteriormente otros, ya que no recibe como parámetro un puntero a archivo, sino un nombre de archivo en el que guardará la matriz. Por esta razón no puedes usar "append". Y así es con funciones similares de MATLAB.

Crear un archivo como el que quieres es sencillo, checa este código:

--- Código: Text ---matriz = [ 1 2 3; 4 5 6; 7 8 9 ];cabecera = 'Esta es mi cabecera'; % Abre archivof = fopen( 'archivo.txt', 'wt' ); % Escribe cabecerasfprintf( f, '%sn', cabecera ); % Escribe valores agrupados en tres columnas por líneafprintf( f, '%d %d %dn', matriz );% Termina escritura de valores de la matriz % Cierra archivofclose( f ); 
Como ves, es bastante sencillo. Si tuvieras muchas más columnas sería tedioso escribir algo como fprintf( f, '%d %d %d %d %d %d....) hasta tener tantas %d como columnas :P. En lugar de eso, usa un for:


--- Código: Text --- % Empieza escritura de valores de la matrizfor filas = 1 : numFilas    for cols = 1 : numColumnas        fprintf( f, '%d ', valor );    end    % Terminamos una fila, empieza nueva línea    fprintf( f, 'n' );end% Termina escritura de valores de la matriz  
Ánimo con esas dudas :).

Estrufi:
Hola, Antes de nada,  muchisimas gracias de verdad, por molestarte en contestarme cada una de mis dudas…, Además soy muy mala explicandome y bueno como has visto también estoy bastante pez en Matlab.

Te cuento, lo que quiero hacer exactamente es algo así:

function graba_tabla_desplazamientos (file,tabla_desplazamientos,t,paso_t,calibracion_t,unidad_t,pasox,pot)


%Graba en un fichero de texto la tabla_desplazamientos y una seria de datos como cabecera.                
%VARIABLES DE ENTRADA:                                                  
%file= string.                        .                        
%t=entero                                                
%paso_t= entero.
%calibracion_t=real    
%unidad_t= string                                    
%pasox=entero                            
%pot=entero                    
%tabla_desplazamientos=matriz de números reales.

Lo que quiero es Adjudicar los valores de la entrada y Conseguir grabar un fichero con la siguiente estructura. Primero una cabecera con los datos y luego la matriz.

Fichero:
t:
paso_t:
calibracion_t:
unidad_t:
pasox:
pot:

pero encima de cada columna de la matriz quisiera poder poner un nombre indicando lo que es cada columna:

x,      y,         dx,        dy,       u_dx,          u_dy,       nu
(tabla_desplazamientos)

No sería posible escribir la cabecera con fprintf, abriendo un fichero primero, y luego grabar a continuación con la opción de save , -append , la matriz? En ese caso en que momento creo la cabecera de la matriz? Seguiría sin poder usar ASCII? Que diferencia hay del formato .dat al .mat? Aún me tiene que llegar el manual que he pedido a la biblioteca, lo siento. Muchisimas gracias.

Geo:
Si save tiene la opción append, puedes usarla, aunque en la ayuda no pude ver que contara con esa opción (en la versión 2007).

Creo que es el momento de que intentes ya crear tu archivo :). Veo que no tendrás demasiadas columnas, en el ejemplo que puse antes puedes ver cómo escribir las cabeceras que deseas, para cada línea sería algo como:


--- Código: Text --- fprintf( archivo, '%s %sn', 'Fichero: ', file );  Lo que indicas es que vas a escribir dos datos de tipo "string" y al final un caracter de fin de línea.

Para los títulos de las columnas, algo como:

--- Código: Text --- fprintf( archivo, '%st%st%st%st%st%st%sn, 'x', 'y', 'dx', 'dy', 'u_dx', 'u_dy', 'nu' );  Aquí estás indicando siete parámetros de tipo "string", separados por tabuladores (t), al final un caracter de fin de línea.
Ya a continuación escribes los valores de la matriz, de manera similar al ejemplo que puse antes.

Prueba y coloca aquí los errores que tengas o dudas que te surjan.

Suerte.

Estrufi:
Hola! Antes de nada muchisimas gracias por las respuestas.

Bueno, antes de ponerme a grabar el fichero, me encuentro con el problema de crear el nombre de este para pasarselo a mi función, (Ya que debo ir cambiando el nombre en un bucle e ir llamando a mi función cada vez con un nombre diferente)
La cosa sería más ó menos así:
Ejemplo:nombredelasecuencia_I05_005
tabla de resultados nº5 obtenida al tomar una de cada 5 imágenes originales para medir el desplazamiento entre ellas.

El nombre de la secuencia lo saco directamente del directorio así:nombre_secuencia=strcat(infolder,(files(i+paso_t).name));

Luego continuaria creando el nombre del file así: file=strcat(nombre_secuencia,'_I', etc etc..);

El problema es que tengo k contar de 00,01,05,.....99 y de 000,001,   y no se como hacerlo con 2 y 3 digitos. Es más, mi programa me pasa el número "paso_t" con 1,2 ó 3 cifras según, pero yo quiero escribirlo siempre con 3 cifras.

 Como puedo hacer?

 Muchisimas gracias, Saludos!

Ah! conoces algún manual bueno de Matlab en castellano, el ultimo k pille no traia apenas nada sobre leer y escribir en ficheros.
Cual es la diferencia entre ficheros .dat y .txt?

Estrufi:
Para poder unir los números a la cadena primero haria una cosa así:

num=sprintf('%d',el numero k sea)

el problema es k no se como hacer para k cuente con 3 digitos ó 4, hay alguna opción?

 Muchisimas gracias. Saludos.

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

[*] Página Anterior

Ir a la versión completa