João Miguel da Costa Sousa
446
Comandos load e save
save nome_ficheiro [variáveis] [opções]
Grava por defeito no ficheiro
matlab.mat
na
directoria de trabalho.
Opções:
-mat
– no formato MAT-file (por defeito).
-ascii
– no formato ASCII separados por espaços.
-compress
– no formato compactado para poupar espaço.
-nocompress
– sem compressão de dados (por defeito).
-append
– adiciona as variáveis especificadas ao ficheiro.
Sempre que se utilizarem dados apenas em Malab, os
comandos load e save devem ser os utilizados.
João Miguel da Costa Sousa
447
Input/Output em Matlab
Função
textread
[a,b,c,...] = textread(nome_fich,formato,n)
Exemplo com ficheiro
testa_entrada.dat
:
Miguel Silva O+ 3.51 22 Sim
Ana Ferreira A+ 3.28 23 Nao
>> [nome,apelido,tipo,grupo,idade,resp] = ...
textread(‘testa_entrada’, ‘%s %s %s %f %d %s’)
João Miguel da Costa Sousa
448
Exemplo com textread
nome =
‘Miguel’
‘Ana’
apelido =
‘Silva’
‘Ferreira’
tipo =
‘O+’
‘A+’
grupo =
3.5100
3.2800
idade =
22
23
resp =
‘Sim’
‘Nao’
Abrir ficheiros
fid = fopen(nome_fich,modo)
[fid,msg] = fopen(nome_fich,modo)
A função
fopen
recebe:
Nome de ficheiro,
nome_fich
, que é uma string;
Modo de abertura,
modo
, que pode ser
‘r’
(por defeito),
‘w’
,
‘a’
,
‘r+’
,
‘w+’
,
‘a+’
, etc.
Retorna:
Identificação do ficheiro,
fid
, que é um inteiro positivo
atribuído pelo Matlab. Se
fid = -1
, ocorreu um erro na
abertura do ficheiro, retornado em:
João Miguel da Costa Sousa
450
Exemplos
fids = fopen(‘all’)
Retorna uma linha com todos os fids dos ficheiros
abertos.
fid = fopen(‘exemplo.dat’,‘r’)
Abre o ficheiro
exemplo.dat
para leitura.
fid = fopen(‘saida_texto’,‘wt’)
Abre o ficheiro
saida_texto
para escrita de texto.
fid = fopen(‘saida_texto’,‘at’)
Abre o ficheiro
saida_texto
já existente, para escrita
de texto a partir do fim do ficheiro.
João Miguel da Costa Sousa
451
Função fclose
estado = fclose(fid)
estado = fclose(‘all’)
A função
fclose
fecha o ficheiro identificado por
fid
.
Na forma
estado=fclose(‘all’)
fecha todos os
ficheiros abertos com excepção de
stdout(fid=1)
e
stderr(fid=2)
.
Retorna
estado
que é o resultado da operação. Se for
efectuada com sucesso retorna 0; caso contrário
retorna -1.
João Miguel da Costa Sousa
452
Funções I/O binárias
cont = fwrite(fid,array,formato)
Escreve no ficheiro
fid
um
array
por colunas com
um
formato
especificado (Tabela pág. 369 do livro).
Retorna o número de valores
cont
escritos no ficheiro.
[array,cont] = fread(fid,número,formato)
Lê um array do ficheiro
fid
um
array
com um
determinado
número
de valores com um
formato
especificado.
Retorna
array
lido e o número de valores
cont
escritos no ficheiro.
Exemplo: io_binario.m
% Ficheiro script: io_binario.m% Este programa mostra como utilizar funções de I/O binárias. % Variaveis:
% cont -- Numero de valores a ler / escrever % fid -- id do ficheiro
% nome_fic -- nome do ficheiro % in_array -- array de entrada % msg -- mensagem de erro % out_array -- array de saída % estado -- estado da operação % Pergunta nome de ficheiro
nome_fic = input('Introduza o nome do ficheiro: ','s'); % Gera o vector linha de dados aleatorios
out_array = randn(1,10000);
% Abre o ficherio de saida para escrita.
[fid,msg] = fopen(nome_fic,'w');
if fid > 0 % Se abertura for bem sucedida: % Escreve os dados de saida.
cont = fwrite(fid,out_array,'float64');
% Informa utilizador
João Miguel da Costa Sousa
454
Exemplo: io_binario.m (2)
% Fecha o ficheiro
estado = fclose(fid);
else
% Escreve mensagem de erro. disp(msg);
end
% Recuperaçao de dados.
% Abertura do ficheiro para leitura.
[fid,msg] = fopen(nome_fic,'r');
if fid > 0 % Se abertura for bem sucedida: % Le os dados de entrada.
[in_array, cont] = fread(fid,[100 100],'float64');
% Informa utilizador
disp([int2str(cont) ' valores lidos.']); % Fecha o ficheiro
estado = fclose(fid);
else
% Escreve mensagem de erro. disp(msg);
end
João Miguel da Costa Sousa
455
Execução
>> io_binario
Introduza o nome do ficheiro: teste_io
10000 valores escritos.
10000 valores lidos.
Foi gerado um ficheiro com 80000 bytes (10000 valors
João Miguel da Costa Sousa
456
Função I/O formatadas
cont = fprintf(fid,formato,val1,val2,...)
fprintf(formato,val1,val2,...)
Escreve no ficheiro
fid
ou na Command Window
(
stdout
) com um dado
formato
os valores
val1
,
val2
, etc.
%-12.5e
Marker
(Required) (Optional)Modifier Field Width(Optional) Precision(Optional) Format Descriptor(Required)
The Components of a Format Specifier
Formatos
Os formatos mais relevantes são:
%c
– caracter simples
%d
– notação decimal (com sinal)
%e,%E
– notação exponencial (com
e
ou
E
)
%f
– real em vírgula flutuante
%g,%G
– a mais compacta de
%f
ou
%e
%s
– string (cadeia de caracteres)
As marcas mais relevantes são:
-
– alinhar à esquerda; por defeito o alinhamento é à direita
+
– escreve sempre um sinal
+
ou
João Miguel da Costa Sousa
458
Exemplo: tabela.m
% Ficheiro script: tabela.m
% Este programa cria uma tabela de raizes quadradas, quadrados e cubos. % (…)
% Variaveis:
% cubos -- valores ao cubo % ii -- indice
% quadrados -- valores ao quadrado % raizes -- valores das raizes quadradas % saida -- tabela de saida
% Escrece o titulo da tabela.
fprintf(' Tabela de raizes quadradas, quadrados e cubos\n\n'); % Cabeçalho das colunas
fprintf(' Numero Raiz Quadrada Quadrados Cubos\n'); fprintf(' ====== ============= ========= =====\n'); % Gera os dados
ii = 1:10;
raizes = sqrt(ii); quadrados = ii.^2; cubos = ii.^3; % Cria a tabela de saida
saida = [ii' raizes' quadrados' cubos']; % Escreve os dados
for ii = 1:10
fprintf (' %2d %12.4f %7d %7d\n', saida(ii,:)); end
João Miguel da Costa Sousa
459
Resultado de execução
>> tabela
Tabela de Raizes quadradas, quadrados e cubos
Numero Raiz Quadrada Quadrados Cubos
====== ============= ========= =====
1 1.0000 1 1
2 1.4142 4 8
3 1.7321 9 27
4 2.0000 16 64
5 2.2361 25 125
6 2.4495 36 216
7 2.6458 49 343
8 2.8284 64 512
9 3.0000 81 729
10 3.1623 100 1000
João Miguel da Costa Sousa
460
Função fscanf
array = fscanf(fid,formato)
[array,cont] = fscanf(fid,formato,tamanho)
Lê do ficheiro
fid
um
array
num dado
formato
especificado. A variável
cont
contém o número de
variáveis lido.
O argumento opcional
tamanho
pode conter:
n
– lê exactamente
n
valores.
Inf
– lê até ao fim do ficheiro.
array
é um vector coluna
com todos os dados lidos.
[n m]
– lê exactamente
n
×
m
valores para uma matriz com
esta dimensão.
Comparação de formatações
% Ficheiro script: comparacao.m
%
% Este programa compara operações de I/O binárias e formatadas.
% Gera
uma tabela de 10000 valores aleatorios e escreve-os no
% disco de forma binária e formatada
%
% Revisoes:
% Data Programador
Descricao das alteracoes
% ==== ============= ========================
% 14/05/06 Joao M. C. Sousa Codigo original
%
% Variaveis:
% cont -- Numero de valores a ler / escrever
% fid -- id do ficheiro
% in_array
-- array de entrada
% msg
-- mensagem de erro
% out_array -- array de saída
% estado
-- estado da operação
% tempo -- tempo gasto em segundos
% Gera os dados
João Miguel da Costa Sousa
462
comparacao.m (2)
% Saida binaria tic;
for ii = 1:10
% Abre ficheiro binario para escrita.
[fid,msg] = fopen('nao_formatado.dat','w'); % Escreve os dados cont = fwrite(fid,out_array,'float64'); % Fecha o ficheiro estado = fclose(fid); end
% Calcula o tempo medio tempo = toc / 10;
fprintf ('Tempo de escrita no ficheiro nao formatado = %6.3f\n',tempo); % Saida formatada
tic; for ii = 1:10
% Abre ficheiro formatado para escrita.
[fid,msg] = fopen('formatado.dat','wt'); % Escreve os dados cont = fprintf(fid,'%23.15e\n',out_array); % Fecha o ficheiro estado = fclose(fid); end
% Calcula o tempo medio tempo = toc / 10;
fprintf ('Tempo de escrita no ficheiro formatado = %6.3f\n',tempo);
João Miguel da Costa Sousa
463
comparacao.m (3)
% Tempo de leitura binariatic; for ii = 1:10
% Abre ficheiro binario para leitura.
[fid,msg] = fopen('nao_formatado.dat','r'); % Le os dados cont = fread(fid,Inf,'float64'); % Fecha o ficheiro estado = fclose(fid); end
% Calcula o tempo medio tempo = toc / 10;
fprintf ('Tempo de leitura no ficheiro nao formatado = %6.3f\n',tempo); % Tempo de leitura formatada
tic; for ii = 1:10
% Abre ficheiro formatado para leitura.
[fid,msg] = fopen('formatado.dat','rt'); % Le os dados cont = fscanf(fid,'%f',Inf); % Fecha o ficheiro estado = fclose(fid); end
% Calcula o tempo medio tempo = toc / 10;
João Miguel da Costa Sousa
464
Execução
>> comparacao
Tempo de escrita no ficheiro nao formatado = 0.001
Tempo de escrita no ficheiro formatado = 0.053
Tempo de leitura no ficheiro nao formatado = 0.001
Tempo de leitura no ficheiro formatado = 0.037
>> !dir *.dat
Volume in drive C has no label.
Volume Serial Number is 0641-3709
Directory of C:\joao\SHEETS\aulas\IntProg
15-05-2006 17:06 250.000 formatado.dat
15-05-2006 17:06 80.000 nao_formatado.dat
2 File(s) 330.000 bytes
0 Dir(s) 137.907.724.288 bytes free
Tipos de dados avançados em Matlab
MATLAB D ata Types
double precision (real and complex)
single precision (real and complex)
integer and unsigned integer data types
logical data character strings
cell arrays structures objects
double single logical char
cell structure user
classes int8, unit8 int16, uint16 int32, unit32 int64, unint64 function handles function handles
João Miguel da Costa Sousa
466
Células de matrizes (Cell arrays)
Uma cell array é uma matriz cujos elementos são
células, com qualquer tipo de elementos.
cell 1,1 cell 1,2 cell 2,1 cell 2,2 − 1 5 0 6 0 2 7 3 1 string.' a text is This ' − − − + 4 3 10 5 4 3 i i i [ ]
João Miguel da Costa Sousa
467
Elementos das cell arrays
Cada elemento aponta
para outra estrutura:
a(2,2) a(1,2) a(2,1) a(1,1) − 1 5 0 6 0 2 7 3 1 'This is a text string.'
[ ]
− − − + i i i 4 3 10 5 4 3João Miguel da Costa Sousa
468
Acesso às células
A notação de parêntesis devolve o conteúdo da célula:
>> a(1,1)
ans =
[3x3 double]
A notação de chavetas devolve o conteúdo do
conteúdo
da célula:
>> a{1,1}
ans =
1 3 7
2 0 6
0 5 1
Criação de cell arrays
Podem ser criadas de duas formas:
Com atribuições;
Por indexação de contéudos (
content indexing
)
Por indexação de células (
cell indexing
)
Com pré-alocação de cell arrays utilizando a
João Miguel da Costa Sousa
470
Criação de células por atribuição
Indexação de contéudos (content indexing)
a{1,1} = [1 3 -7; 2 0 6; 0 5 1];
a{1,2} = ‘This is a text string.’;
a{2,1} = [3+4*i -5; -10*i 3-4*i];
a{2,2} = [];
Indexação de células (cell indexing)
a(1,1) = {[1 3 -7; 2 0 6; 0 5 1]};
a(1,2) = {‘This is a text string.’};
a(2,1) = {[3+4*i -5; -10*i 3-4*i]};
a(2,2) = {[]};
João Miguel da Costa Sousa
471
Pré-alocação de células
Criação de uma célula vazia:
a = cell(2,2);
As chavetas ‘{ }’ são construtores tal como os
parêntesis rectos ‘[ ]’ o são para as arrays.
Exemplo:
b = {[1 2], 17, [2;4];...
3-4*i, ‘Hello’, eye(3)};
João Miguel da Costa Sousa
472
Visualização de células
>>
a
a = [3x3 double] [1x22 char];
[2x2 double] [];
>>
b
b = [1x2 double] [ 17] [2x1 double];
[3.0000-4.0000i] ‘Hello’ [3x3 double];
>>
celldisp(a)
a{1,1} =
1 3 -7
2 0 6
0 5 1
a{2,1} =
3.0000 + 4.0000i -5.0000
0 -10.0000i 3.0000 - 4.0000i
a{1,2} =
This is a text string.
a{2,2} =
[]
Função cellplot
>> cellplot(b)
João Miguel da Costa Sousa
474
Extensão de células
É bastante ineficiente e deve ser evitado.
Exemplo:
a{3,3} = 5;
cell 1,1 cell 1,2 cell 2,1 cell 2,2 − 1 5 0 6 0 2 7 3 1 string.' a text is This ' − − − + 4 3 10 5 4 3 i i i [ ] cell 1,3 cell 2,3cell 3,1 cell 3,2 cell 3,3
[ ]
[ ]
[ ] [ ] [ ]5
João Miguel da Costa Sousa
475
Exemplo: testa_prealocacao.m
% Ficheiro script: testa_prealocacao.m
% Este programa testa a criacao de cell arrays com e sem prealocacao. %
% Revisoes: (...) % Variaveis:
% a - Cell array
% dimensao - Dimensao da cell array % Cria array sem prealocacao
clear all dimensao = 50000; tic
for ii = 1:dimensao
a{ii} = ['Elemento ' int2str(ii)]; end
disp( ['Tempo gasto sem prealocacao = ' num2str(toc)] ); % Cria array com prealocacao
clear all dimensao = 50000; tic
a = cell(1,dimensao); for ii = 1:dimensao
a{ii} = ['Elemento ' int2str(ii)]; end
João Miguel da Costa Sousa
476
Apagar células
>>
a
a =
[3x3 double] [1x22 char] []
[2x2 double] [] []
[] [] [5]
>>
a(3,:)= []
a =
[3x3 double] [1x22 char] []
[2x2 double] [] []
Utilização de dados
>>
c = {[1 2; 3 4], ‘caes’, ‘gatos’, i};
>> c{1,1}
ans =
1 2
3 4
>> c{2,1}
ans =
gatos
>> c{1,1}(2,1)
ans =
2
João Miguel da Costa Sousa
478
Células de strings
Podem ter número de elementos diferentes; são mais flexíveis.
Podem ser criadas elemento a elemento, ou convertendo os
dados de um array:
>>
cellstring{1} = ‘Joao M. Sousa’;
>>
cellstring{2} = ‘Lisboa’;
>>
cellstring{3} = ‘BI 900000000’;
>>
cellstring
‘Joao M. Sousa’ ‘Lisboa’ ‘BI 900000000’
>>
dados = [‘Linha 1 ’; ‘Linha adicional’]
dados =
Linha 1
Linha adicional
>>
c = cellstr(dados)
c =
‘Linha 1’
‘Linha adicional’
João Miguel da Costa Sousa
479
Significado das células
São muito flexíveis e podem ser utilizadas em muitos
comandos internos do Matlab.
Os argumentos opcionais do Matlab são dados por
varargin
, que é uma célula.
Assim, os argumentos de uma função podem ser
variáveis, e do tipo que se quiser:
function teste1(
varargin)
disp([‘Existem ’ int2str(varargin) ‘ argumentos.’]);
disp([‘Os argumentos de entrada sao:’);
disp(
varargin);
João Miguel da Costa Sousa
480
Execução de teste1.m
>>
teste1
Existem 0 argumentos.
Os argumentos de entrada sao:
>>
teste1(6)
Existem 6 argumentos.
Os argumentos de entrada sao:
[6]
>>
teste1(1, ‘teste 1’, [1 2; 3 4])
Existem 3 argumentos.
Os argumentos de entrada sao:
[1] ‘teste 1’ [2x2 double]
Exemplo: função plot_linha.m
function plot_linha(varargin)%PLOT_LINHA faz os graficos especificados pelos pares [x,y]
% Funcao PLOT_LINHA aceita um numero arbitrario de pontos [x,y] e traca uma % linha ligando os pontos. Pode aceitar a especificação do tipo de linha do % grafico.
% Variaveis:
% ii -- Indice % jj -- Indice
% linespec -- String definido as especificacoes do plot % msg -- Mensagem de erro
% varargin -- Celula com os argumentos de entrada % x -- Valores de x do grafico
% y -- Valores de x do grafico %
% Registo das revisões:
% Data Programador Descricao das alteracoes % ======== ================ ======================== % 21/05/06 Joao M. C. Sousa Codigo original % Verifica se o numero de argumentos e' correcto
% Sao necessarios pelo menos 2 pontos para tracar uma linha msg = nargchk(2,Inf,nargin);
João Miguel da Costa Sousa
482
Função plot_linha.m (2)
% Inicializa variaveis jj = 0;
linespec = '';
% Le os valores de x e y, assegurando que a string com % especificacao da linha do grafico, se existir, e guardada. for ii = 1:nargin
% Este argumento um par [x,y] ou a especificacao da linha? if ischar(varargin{ii})
% Guarda o valor da especificacao da linha linespec = varargin{ii};
else
% E' um par [x,y]. Guarda os valores. jj = jj + 1;
x(jj) = varargin{ii}(1); y(jj) = varargin{ii}(2); end
end
% Faz o grafico da funcao. if isempty(linespec)
plot(x,y); else
plot(x,y,linespec); end
end % funcao plot_linha
João Miguel da Costa Sousa
483
Exemplo de execução
João Miguel da Costa Sousa
484
Argumento varargout
function [nvals,varargout] = teste2(mult)
%
nvals e’ o numero de variaveis retornado
%
varargout contem as variaveis retornadas
nvals = nargout – 1;
for ii = 1:nargout–1
varargout{ii} = randn * mult;
end
end % funcao teste2
Execução de teste2
>>
teste2(4)
ans =
-1
>>
[a b c d] = teste2(4)
a =
3
b =
-1.7303
c =
-6.6623
d =
0.5013
João Miguel da Costa Sousa
486
Estruturas
As estruturas (structures) são arrays em Matlab que
contêm vários campos (fields).
Os campos de uma estrutura têm um nome e podem
conter qualquer tipo de dados.
Esta estrutura é semelhante às fichas em Fortran90.
Os campos são acedidos através de um ponto “
.
”.
Exemplo: ver
student.name
na pág. seguinte.
João Miguel da Costa Sousa
487
Exemplo de estrutura
student 123 Main Street John Doe 71211 LA Anytown name addr1 city state zipJoão Miguel da Costa Sousa
488
Criação de estruturas
As estruturas podem ser criadas utilizando atribuições
De uma vez, utilizando a função
struct
.
Exemplo:
>> student.name = ‘John Doe’;
>> student.addr1 = ‘123 Main Street’;
>> student.city = ‘Anytown’;
>> student.state = ‘LA’;
>> student.zip = ‘71211’
student =
name: ‘John Doe’
addr1: ‘123 Main Street’
city: ‘Anytown’;
state: ‘LA’
zip: ‘71211’
Criação com atribuições
Pode ser incluído um segundo elemento:
>> student(2).name = ‘Jane Q. Public’;
student =
1x2 struct array with fields:
name
addr1
city
state
zip
>> student(2)
ans =
name: ‘Jane Q. Public’
addr1: []
city: []
state: []
zip: []
João Miguel da Costa Sousa
490
Criação de estruturas com struct
A utilização da finção
struct
pré-aloca espaço em
memória.
str_array = struct(‘campo1’,val1,‘campo2’,val2,...)
Inicialização:
>> student(1000) = struct(‘name’,[],‘addr1’,[],...
‘city’,[],‘state’,[],‘zip’,[])
student =
1x1000 struct array with fields:
name
addr1
city
state
zip
João Miguel da Costa Sousa
491
Adição e remoção de campos
>> student(2).exams = [90 82 88]
student =
1x2 struct array with fields:
name
addr1
city
state
zip
exams
>> stud2 = rmfield(student,‘zip’)
stud2 =
1x2 struct array with fields:
name
addr1
city
state
exams
João Miguel da Costa Sousa
492
Exemplo de estrutura
student student .name .addr1 .city .state .zip .exams .name .name .addr1 .addr1 .city .city .state .state .zip .zip .exams .exams'John Doe' 'Jane Q. Public' 'Big Bird'
'123 Sesame Street' 'P. O. Box 17'
'123 Main Street'
'Nowhere' 'New York' 'Anytown' 'NY' 'MS' 'LA' '68888' '10018' '71211' [65 84 81] [90 82 88] [80 95 84] student(1)
student(1) student(2)student(2) student(3)student(3)
Utilização de dados em estruturas
>> student(2).addr1
ans =
P. O. Box 17
>> student(3).exams
ans =
65 84 81
>> student(3).exams(2)
ans =
84
Os campos das estruturas podem ser argumentos de funções:
>> mean(student(2).exams)
ans =
86.6667
João Miguel da Costa Sousa
494
Utilização de dados em estruturas (2)
Os valores dos campos não podem ser extraídos para um array.
Têm de se utilizar ciclos para trabalhar esses dados.
Exemplo: a expressão
student.zip
retorna três tabelas
separadas. Para se obter numa array:
for ii = 1:length(student)
zip(ii) = student(ii).zip
end
Exemplo: média de todos os exames de todos os estudantes:
lista_exames = [];
for ii = 1:length(student)
lista_exames = [lista_exames student(ii).exams];
end
mean(lista_exames)
João Miguel da Costa Sousa
495
Nomes de campo dinâmicos
Os nomes de campo dinâmicos podem ser alterados
durante a execução.
>> student(1).name
ans =
John Doe
>> student(1).(‘name’)
ans =
John Doe
João Miguel da Costa Sousa
496
Função calc_media.m
function [media, nvals] = calc_media(estrutura,campo) %CALC_MEDIA calcula a média dos valors num dado campo. % Função CALC_MEDIA calcula o valor medio dos elementos % num dado campo de uma estrutura s(tructure array). % Devolve a media e (opcionalmente) o numero de elementos % para os quais se calculou a média
% Variaveis:
% vector_aux -- Array dos valores para calcular a media % media -- media de vector_aux
% ii -- Indice %
% Registo das revisões:
% Data Programador Descricao das alteracoes % ======== ================ ======================== % 22/05/06 Joao M. C. Sousa Codigo original % Testa se o numero de argumentos e' correcto. msg = nargchk(2,2,nargin);
error(msg);
% Cria um vector com os valores do campo vector_aux = [];
for ii = 1:length(estrutura)
vector_aux = [vector_auxestrutura(ii).(campo)];
end