Viernes 1 de Noviembre de 2024, 09:20
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación Específica
»
Matlab
»
Crear y leer fichero
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Crear y leer fichero (Leído 13373 veces)
Estrufi
Miembro MUY activo
Mensajes: 158
Crear y leer fichero
«
en:
Viernes 31 de Octubre de 2008, 12:13 »
0
Hola, quiero crear una función más ó menos como la siguiente, soy bastante mala programando y no controlo demasiado Matlab.
function graba_tabla (nombre_fichero,tabla,paso,dato)
%%%%Tabla es una matriz.
%%%%Si quiero grabar en fichero de texto una cosa más ó menos así:
Nombre fichero:'el nombre'
Paso:'el paso'
Dato:'el dato'
Y justo debajo también escribir la tabla pero etiquetando lo que es cada columna:
%Tabla:
dato1 dato2 dato3 dato4... daton.
Aqui meter la matriz de n columnas.
return
Esto como lo podría conseguir en Matlab?? Puedo hacer que lo escriba en un determinado directorio de work que yo cree?? Además me gustaría luego crear alguna función que pueda leer algunos datos de la tabla y operar con ellos.
Muchisimas gracias.
Tweet
Geo
Miembro de PLATA
Mensajes: 1011
Nacionalidad:
Re: Crear y leer fichero
«
Respuesta #1 en:
Lunes 3 de Noviembre de 2008, 05:47 »
0
Puedes usar la función
printf
para grabar los datos que quieres, para crear el archivo usas
fopen
. Revisa el foro que hay varios mensajes que te pueden ser de utilidad.
La imaginación es el límite.
Hardware & Software
|
Mexchip
Estrufi
Miembro MUY activo
Mensajes: 158
Re: Crear y leer fichero
«
Respuesta #2 en:
Lunes 3 de Noviembre de 2008, 09:33 »
0
Y en que se diferencia SAVE de Printf ???? Quiero decir, cuando uso SAVE es necesario tb el fopen??? y grabando directamente con save ya no seria necesario el printf? que tipos de datos puedo guardar con printf??
Geo
Miembro de PLATA
Mensajes: 1011
Nacionalidad:
Re: Crear y leer fichero
«
Respuesta #3 en:
Lunes 3 de Noviembre de 2008, 16:20 »
0
save
guarda las variables que están en el workspace, para conseguir algo como lo que quieres tendrías que poner los datos que deseas como cabecera del archivo en variables dentro del workspace. Con
fprintf
tú vas indicando las variables a guardar.
La imaginación es el límite.
Hardware & Software
|
Mexchip
Estrufi
Miembro MUY activo
Mensajes: 158
Re: Crear y leer fichero
«
Respuesta #4 en:
Lunes 3 de Noviembre de 2008, 16:27 »
0
No lo veo muy claro..., lo siento. Muchas gracias
Geo
Miembro de PLATA
Mensajes: 1011
Nacionalidad:
Re: Crear y leer fichero
«
Respuesta #5 en:
Lunes 3 de Noviembre de 2008, 17:25 »
0
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
.
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
% Variables
matriz = [ 1 2 3; 4 5 6; 7 8 9 ];
cabecera = 'Esta es mi cabecera';
% Guarda a archivo .mat
save( 'archivo.mat', 'cabecera', 'matriz );
También puedes usar la función save de esta forma:
Código: Text
% Guarda a archivo .mat
save 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 archivo
f = fopen( 'archivo.txt', 'wt' );
% Escribe cabeceras
fprintf( f, '%sn', cabecera );
% Escribe valores agrupados en tres columnas por línea
fprintf( f, '%d %d %dn', matriz );
% Termina escritura de valores de la matriz
% Cierra archivo
fclose( 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
. En lugar de eso, usa un for:
Código: Text
% Empieza escritura de valores de la matriz
for 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
.
La imaginación es el límite.
Hardware & Software
|
Mexchip
Estrufi
Miembro MUY activo
Mensajes: 158
Re: Crear y leer fichero
«
Respuesta #6 en:
Martes 4 de Noviembre de 2008, 16:21 »
0
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
Miembro de PLATA
Mensajes: 1011
Nacionalidad:
Re: Crear y leer fichero
«
Respuesta #7 en:
Jueves 6 de Noviembre de 2008, 14:40 »
0
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.
La imaginación es el límite.
Hardware & Software
|
Mexchip
Estrufi
Miembro MUY activo
Mensajes: 158
Re: Crear y leer fichero
«
Respuesta #8 en:
Martes 11 de Noviembre de 2008, 11:34 »
0
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
Miembro MUY activo
Mensajes: 158
Re: Crear y leer fichero
«
Respuesta #9 en:
Martes 11 de Noviembre de 2008, 12:43 »
0
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.
Estrufi
Miembro MUY activo
Mensajes: 158
Re: Crear y leer fichero
«
Respuesta #10 en:
Martes 11 de Noviembre de 2008, 13:16 »
0
Hola de nuevo, una ultima duda: Tal y como kiero hacer la tabla...
f=fopen(strcat(file,'.txt'),'w+');
fprintf(f,'Nombre fichero: %sn',file);
fprintf(f,'t: %dn',t);
fprintf(f,'paso_t: %dn',paso_t);
fprintf(f,'calibracion_t: %fn',calibracion_t);
fprintf(f,'unidad_t: %sn',unidad_t);
fprintf(f,'pasox: %dn',pasox);
fprintf(f,'pasoy: %dn',pasoy);
fprintf(f,'tamaño_region_2^: %dn',pot);
fprintf(f,'umbral: %fn',umbral);
fprintf(f,'calibracion_x: %fn',calibracion_x);
fprintf(f,'calibracion_y: %fn',calibracion_y);
fprintf(f,'unidad_l: %sn',unidad_l);
fprintf(f,'x y dx dy u_dx u_dy nu n'); %Cabecera de la matriz.
%fprintf( archivo, '%st%st%st%st%st%st%sn, 'x', 'y', 'dx', 'dy', 'u_dx', 'u_dy', 'nu' );
for filas=1:Q
fprintf(f,'%f %f %f %f %f %f %d n',tabla_desplazamientos);
end
fclose(f);
return
Esto tendria sentido? aun no lo he probado, estoy esperando a saber construir el nombre de file, con lo k comento arriba...
Muchisimas gracias.
Estrufi
Miembro MUY activo
Mensajes: 158
Re: Crear y leer fichero
«
Respuesta #11 en:
Miércoles 12 de Noviembre de 2008, 11:27 »
0
Hola!!
Al final en la parte de la función para crear la matriz con sus cabeceras he hecho:
fprintf(f, '%st%st%st%st%st%st%sn', 'x', 'y', 'dx', 'dy', 'u_dx', 'u_dy', 'nu' );
for filas=1:Q
fprintf(f, '%ft%ft%ft%ft%ft%ft%dn', tabla_desplazamientos);
end
Lo he probado y me sale un fichero así:
Nombre fichero: Pruebaimag0003.tif_I1_1
t: 1
paso_t: 1
calibracion_t: 1.000000
unidad_t: s
pasox: 32
pasoy: 32
tamaño_region_2^: 7
umbral: 0.500000
calibracion_x: 1.000000
calibracion_y: 1.000000
unidad_l: mm
x y dx dy u_dx u_dy nu
128.000000 640.000000 0.288062 0.884419 0.118659 0.443981 6
128.000000 640.000000 0.288062 0.884419 0.118659 0.443981 6
128.000000 640.000000 0.288062 0.884419 0.118659 0.443981 6
128.000000 640.000000 0.288062 0.884419 0.118659 0.443981 6
128.000000 640.000000 0.288062 0.884419 0.118659 0.443981 6
(son mas filas pero las he borrado..)
Los unicos problemas k tengo ahora es poner cada nombre encima de la columna correcta, ya k salen un poco descentrados. Y conseguir que el nombre del fichero:
Pruebaimag0003.tif_I1_1 en realidad sea Pruebaimag0003.tif_I01_001, con 2 y 3 digitos respectivamente..., ya k este nombre se va cambiando en un bucle mientras hacemos distintas medidas. ¿Se te ocurre algo? He buscado en un par de manuales, pero no he encontrado nada.
Muchisiiimas gracias por todo. Saludos!
Estrufi
Miembro MUY activo
Mensajes: 158
Re: Crear y leer fichero
«
Respuesta #12 en:
Jueves 13 de Noviembre de 2008, 11:25 »
0
Tengo un problema!! Resulta k la matriz estaba mal calculada...y estaba haciendo solo una linea, ahora la he calculado bien, pero los resultados me los graba mal:
Poniendo esto:
fprintf(f, '%sttt%sttt%sttt%sttt%stt%stt%sn', 'x', 'y', 'dx', 'dy', 'u_dx', 'u_dy', 'nu' );
for filas=1:Q
fprintf(f, '%dt%dt%ft%ft%ft%ft%dn', tabla_desplazamientos);
fclose(f);
return
Me sale algo así:
x y dx dy u_dx u_dy nu
16 16 48.000000 48.000000 48.000000 80.000000 80
80 80 112.000000 112.000000 496.000000 560.000000 368
400 432 400.000000 432.000000 464.000000 656.000000 432
624 3.942151e-002 0.031646 0.177913 0.214485 0.230994 3.150616e-001
2.014277e-001 3.332901e-001 0.312544 0.157933 1.384341 0.650919 -2.921787e+000
-3.734466e-001 1.612407e+000 1.081187 1.892821 1.269534 1.219600 -3.125440e-001
2.001913e+000 -6.162923e-001 0.000566 0.036826 0.122135 0.081458 3.990918e-002
7.727177e-002 2.058310e-001 0.237355 0.344691 0.164698 0.110252 1.108553e-002
3.293859e-001 2.714914e-001 0.236088 0.119215 0.186629 0.413563 7.629885e-001
3.445276e-001 2.799322e-001 0.049306 4.000000 4.000000 4.000000 4
4 6 8.000000 6.000000 4.000000 4.000000 4
O sea, las va guarndando al reves, yo jeria k en las x estuviese :16 16 48 48 etc.. etc.
¿como puedo hacer??
Muchisimas gracias!!!! siento la cantidad de dudas juntas, pero es k no da salido.
Geo
Miembro de PLATA
Mensajes: 1011
Nacionalidad:
Re: Crear y leer fichero
«
Respuesta #13 en:
Jueves 13 de Noviembre de 2008, 16:32 »
0
Bien, el formato en que se escriben los números depende del parámetro que pases: %d - número entero decimal, %f - número de punto/coma flotante. Con el primero no tendrás parte decimal, con el segundo si.
Luego, la cuestión de las separaciones, en los parámetros pasaste un parámetro t, que indica insertar un caracter tabulador (la tecla TAB en tu teclado), el detalle es que este TAB podrían interpretarlo diferente algunos editores de texto, algunos sustituyen el caracter TAB con un cierto número de espacios, los cuales pueden variar entre programas ¿con qué programa abres tu archivo resultante?
Para ordenar más adecuadamente, puedes determinar cuántos caracteres deseas utilizar para cada opción, pasando el número de caracteres deseados junto al formato numérico deseado. Por ejemplo: %3d, indica escribir un número entero forzando a que utilice al menos tres caracteres, si el número fuera de dos dígitos, el se agrega un espacio automáticamente para completar los 3. En tu código, puedes determinar cuál es el máximo de dígitos que deseas y utilizarlo como parámetro, algo como esto: También puedes indicar el número de dígitos decimales que deseas, haciendolo de esta forma: %.2f, indica formato flotante con dos decimales. Puedes combiarlas: %10.2f, formato flotante que utilice 10 digitos con dos decimales.
Código: Text
fprintf( f, '%10d %10d %10f %10f');
Haz varias pruebas y observa cómo va quedando para que vayas realizando los ajustes necesarios.
En cuanto a contar agregando ceros a la izquierda, no se cuenta con ceros a la izquierda, sino que estos se agregan al convertir a caracter (al generar tu nombre de archivo). El contador seguirá su lógica: 1, 2, 3... al momento de concatenar este valor para formar el nombre del archivo es donde debes agregarle tantos ceros (caracteres) como desees. Si no te sale con gusto más tarde pongo un ejemplo (no tengo MATLAB aquí )
.
Suerte.
La imaginación es el límite.
Hardware & Software
|
Mexchip
Estrufi
Miembro MUY activo
Mensajes: 158
Re: Crear y leer fichero
«
Respuesta #14 en:
Viernes 14 de Noviembre de 2008, 11:24 »
0
Buenas! Antes de nada gracias por todo.
A ver, entonces yo si hago:
num_tabla=1;
pero quiero que tabla sea un string='01'
haciendo:
tabla=sprintf('%2d',num_tabla);
no se consigue nada directamente, con lo que tendría que hacer un "if" para , en caso de llegar a 9, añadir un 1, y asi poder escribir en tabla:
00
01
02
03
04
et..
Se me entiende? Es k creo k me explico bastante mal, lo siento.
Por otro lado, lo de leer la matriz no era tanto por lo del formato (pero muchas gracias, pork me ha aclarado bastante), si no que parece que iba cogiendo de columnas y guardandolo en el fichero, al final hice así:
fprintf(f, '%sttt%sttt%sttt%sttt%stt%stt%sn', 'x', 'y', 'dx', 'dy', 'u_dx', 'u_dy', 'nu' ); %Para la cabecera.
for fila=1:Q
fprintf(f,'%d %d %f %f %f %f %d n',tabla_desplazamientos(fila,:));
end
Y claro me queda una cosa así en el fichero tipo texto:
x y dx dy u_dx u_dy nu
16 496 0.039422 0.650919 0.000566 0.011086 4
16 560 0.031646 -2.921787 0.036826 0.329386 4
48 368 0.177913 -0.373447 0.122135 0.271491 4
48 400 0.214485 1.612407 0.081458 0.236088 4
48 432 0.230994 1.081187 0.039909 0.119215 4
80 400 0.315062 1.892821 0.077272 0.186629 6
80 432 0.201428 1.269534 0.205831 0.413563 8
80 464 0.333290 1.219600 0.237355 0.762988 6
80 656 0.312544 -0.312544 0.344691 0.344528 4
112 432 0.157933 2.001913 0.164698 0.279932 4
112 624 1.384341 -0.616292 0.110252 0.049306 4
Ahora tengo que conseguir k kede mas centrado, voy a ponerme a probar con tabuladores a ver si no da problemas,ok?
Se te ocurre algo para lo de los digitos? No hay manera de poner contar 01,02, et.. y pasarlo a string de manera más directa,no?
Muchisimas gracias por todo!
Saludos!
Estrufi
Miembro MUY activo
Mensajes: 158
Re: Crear y leer fichero
«
Respuesta #15 en:
Viernes 14 de Noviembre de 2008, 11:28 »
0
Buenas!
Para aclarar más lo que quiero conseguir:
Nombre fichero: Pruebaimag0003.tif_I1_1 Esto es lo que consigo ahora, pero lo que quiero conseguir es :
Nombre fichero: Pruebaimag0003.tif_I01_001
Lo que hago es lo siguiente:
nombre_secuencia=strcat(infolder,(files(i+paso_t).name));
num_tabla=num_tabla+1;%Actualizamos el número de tabla.
tabla=sprintf('%d',num_tabla);
paso=paso_t;
paso=sprintf('%d',paso_t);
file=strcat(nombre_secuencia,'_I',tabla,'_',paso);
Claro no basta sólo con añadirle un "0", porque llegara un punto en el que el contador sea 10,11, ..99, etc.. por eso te comentaba lo de usar if.
Muchisimas gracias por todo.
Saludos!!
Geo
Miembro de PLATA
Mensajes: 1011
Nacionalidad:
Re: Crear y leer fichero
«
Respuesta #16 en:
Sábado 15 de Noviembre de 2008, 16:25 »
0
Además de probar con tabuladores para acomodar las columnas, prueba indicando también el número de caracteres como mencioné antes, p. ej.: %10d.
Para crear el nombre de archivo, es como mencionaste, tienes que agregar tantos ceros como sean necesarios al momento de concatenar, en MATLAB creo que no hay otra manera ya que no hay forma de indicar el caracter a insertar cuando los dígitos no cubren el número de caracteres deseados.
La imaginación es el límite.
Hardware & Software
|
Mexchip
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación Específica
»
Matlab
»
Crear y leer fichero