Leer y Escribir números con Matlab. Formatos Numéricos.

Apreder como se leer y escribir números con Matlab

Tipo / Formato de números en Matlab

x=1/3 %by default format = format short
x = 0.3333
format long
x
x =
0.333333333333333
format short e
x
x =
3.3333e-01
format long e
x
x =
3.333333333333333e-01
format rat %closest rational to the real value
x
x =
1/3
format %returns to the default value

Escribir en pantalla valores

Hay dos formas básicas para mostrar números en la pantalla de la terminal.
message=['present value = ', num2str(x)]; %as a string vector
disp(message)
present value = 0.33333
o utilizando la función fprintf con los siguientes formatos:
fprintf('present value = %8.6f \n',x); % notice the format
present value = 0.333333
fprintf('present value = %6.4e \n',x); % notice the format
present value = 3.3333e-01

Escribir valores a un fichero

filename='values.txt'; %assign a name to the file
fout=fopen(filename,'w'); %open the file to write values
fprintf(fout, 'present value = %6.4f, next = %6.4f \n',x, 1000*x);
fprintf(fout, '\n');
fprintf(fout, 'present value = %6.4e, next = %6.4e \n',x, 1000*x);
fprintf(fout, '\n');
fprintf(fout, 'present value = %22.16e, , next = %22.16e \n',x,1000*x);
fclose(fout); %close the file
type('values.txt') %show the file contens
present value = 0.3333, next = 333.3333 present value = 3.3333e-01, next = 3.3333e+02 present value = 3.3333333333333331e-01, , next = 3.3333333333333331e+02
% edit('values.txt') %shows the file into the Matlab editor window

Escribir un vector

v = 0:10;
filename='vector.txt'; %assign a name to the file
fout=fopen(filename,'w'); %open the file to write values
fprintf(fout, 'First as a column \n');
for i=1:length(v)
fprintf(fout, '%6.4f \n',v(i)); %as a column vector
end
fprintf(fout, 'Now as a row \n');
for i=1:length(v)
fprintf(fout, '%6.4f, ',v(i)); %as a row vector
end
fclose(fout); %close the file
type('vector.txt')
First as a column 0.0000 1.0000 2.0000 3.0000 4.0000 5.0000 6.0000 7.0000 8.0000 9.0000 10.0000 Now as a row 0.0000, 1.0000, 2.0000, 3.0000, 4.0000, 5.0000, 6.0000, 7.0000, 8.0000, 9.0000, 10.0000,

Escribir una Matriz

M=rand(5,5);
% You can write the elements one by one using two for loops, like in the vector case
filename='matrix1.txt'; %assign a name to the file
fout=fopen(filename,'w'); %open the file to write values
for i=1:5
for j=1:5
fprintf(fout,'%22.16e ',M(i,j));
end
fprintf(fout,'\n');
end
fclose(fout); %close the file
type('matrix1.txt')
8.1472368639317894e-01 9.7540404999409525e-02 1.5761308167754828e-01 1.4188633862721534e-01 6.5574069915658684e-01 9.0579193707561922e-01 2.7849821886704840e-01 9.7059278176061570e-01 4.2176128262627499e-01 3.5711678574189554e-02 1.2698681629350606e-01 5.4688151920498385e-01 9.5716694824294557e-01 9.1573552518906709e-01 8.4912930586877711e-01 9.1337585613901939e-01 9.5750683543429760e-01 4.8537564872284122e-01 7.9220732955955442e-01 9.3399324775755055e-01 6.3235924622540951e-01 9.6488853519927653e-01 8.0028046888880011e-01 9.5949242639290300e-01 6.7873515485777347e-01
% or directly using
save('matrix2.txt','M','-ascii') %as you can see we loose some precission
type('matrix2.txt')
8.1472369e-01 9.7540405e-02 1.5761308e-01 1.4188634e-01 6.5574070e-01 9.0579194e-01 2.7849822e-01 9.7059278e-01 4.2176128e-01 3.5711679e-02 1.2698682e-01 5.4688152e-01 9.5716695e-01 9.1573553e-01 8.4912931e-01 9.1337586e-01 9.5750684e-01 4.8537565e-01 7.9220733e-01 9.3399325e-01 6.3235925e-01 9.6488854e-01 8.0028047e-01 9.5949243e-01 6.7873515e-01

Leer datos codificados con ASCII

El ASCII es una codification por caracteres ampliamente usada en la programación. Los digitos también tienen su codificación en ASCII.
Como siempre asumimos que los datos del archivo están correctamente codificados. En nuestro caso compararemos los resultados con las matrices que ya habíamos generado.
newM1=load('matrix1.txt','-ascii');
max(max(M-newM1)) %perfect precission is achieved
ans = 0
newM2=load('matrix2.txt','-ascii');
max(max(M-newM2)) %the error is increasing because no all decimals are saved
ans = 4.8578e-09

Escribir y leer en un EXCEL hoja de cálculo

% Write on a xlsx file:
matH5=hilb(5); %one 5x5 matrix
filename = 'testdata.xlsx';
xlswrite(filename,matH5) %by default data are written from the fisrt cell.
Warning: Unable to write to Excel format, attempting to write file to csv format. To write to an Excel file, convert your data to a table and use writetable.
% we can add more information using the appropiate cell range.
matH4=hilb(4);
xlswrite(filename,matH4,'F6:I9');
Warning: Unable to write to Excel format, attempting to write file to csv format. To write to an Excel file, convert your data to a table and use writetable.
% Read from an xlsx file
newH5=xlsread(filename,'A1:E5');
Error using xlsread (line 136)
XLSREAD unable to open file 'testdata.xlsx'.
File 'C:\Users\weiji\Desktop\19-20 Q1\TMM\PAM2.4\testdata.xlsx' not found.
max(max(matH5-newH5)) %max error (notice that the precission is preserved)
Leer otros rangos
HH=xlsread(filename,'D4:J7') %notice that empty cell are NaN
se pueden convertir los NaN a cero con la función isnan.
HH(isnan(HH)) = 0

Usando cabeceras en una hoja de cálculo

Finalmente consideramos el caso donde hay texto en el xlms (ejemplo de la documentación de Matlab)
% write
values = {1, 2, 3 ; 4, 5, 'x' ; 7, 'y', 9}; %it is a cell variable because it contains numbers and strings
headers = {'First','Second','Third'};
xlswrite('withHeaders.xlsx',[headers; values]);
% read
filename = 'withHeaders.xlsx';
A = xlsread(filename) %headers are ignored and non numerical entries are considered NaN
xlRange = 'B2:C3'; %reading a precise range. Notice that the first row are the headers.
B = xlsread(filename,xlRange)
Tota la información
[num,txt,raw] = xlsread(filename)

Ejercicio 1:

Usando el archivo testdata.xlms, calcula la media de cada columna y escribe en un archivo nuevo testdataMean.xlms esta nueva fila después de los datos (como si hicieras la media de cada columna a EXCEL).

Trabajando con Filas y Folders con Matlab

Como ejemplo, vamos a general varios archivos xlsx y trabaja allí leyendo el contenido y haciendo algunos cálculos.
numFiles= 5
mkdir Data; %the folder Data must be created before to write files
for i=1:numFiles
M=i*magic(5);
xlswrite(['./Data/dataname' num2str(i) '.xlsx'],M);
end
Ahora leemos de la carpeta buscando los nombres de los ficheros con datos
folder = '.\Data\';
files = dir([folder,'*.xlsx']); %all the
size(files,1)
files(1).name % to see the names
Finalmente, como ejemplo, llegim tots els fitxers y añadimos las celdas (3,3) de cada hoja de cálculo
suma = 0;
for i=1:size(files,1)
filename=files(i).name; %name of each file
A = xlsread([folder filename]);
suma = suma + A(3,3);
end
suma

Ejercicio 2:

Utilizando los datos de los ficheros anteriores calcule la mitjana de la primera columna utilizando todos los ficheros.

(C) Numerical Factory 2019