Comandos load e save - fenix.tecnico.ulisboa.pt · % Gera uma tabela de 10000 valores aleatorios e...
Transcript of Comandos load e save - fenix.tecnico.ulisboa.pt · % Gera uma tabela de 10000 valores aleatorios e...
1
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’)
2
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’
João Miguel da Costa Sousa 449
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:
� Mensagem com erro, msg.
3
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.
4
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 formatoespecificado.
�Retorna array lido e o número de valores contescritos no ficheiro.
João Miguel da Costa Sousa 453
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
disp([int2str(cont) ' valores escritos.']);
5
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 de 64 bits, onde cada valor ocupa 8 bytes).
6
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)Modifier
(Optional)Field Width
(Optional)Precision
(Optional)Format Descriptor
(Required)
The Components of a Format Specifier
João Miguel da Costa Sousa 457
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 -0 – preenche com zeros em vez de espaços em branco
7
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
8
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 formatoespecificado. 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.
João Miguel da Costa Sousa 461
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
out_array = randn(1,10000);
9
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 binaria
tic;
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;
fprintf ('Tempo de leitura no ficheiro formatado = %6.3f\n',tempo);
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
João Miguel da Costa Sousa 465
Tipos de dados avançados em Matlab
MATLAB Data Types
double precision(real and complex)
single precision(real and complex)
integer and unsignedinteger data types
logical data character strings
cell arrays structures objects
double single logical char
cell structureuser
classes
int8, unit8
int16, uint16
int32, unit32
int64, unint64
function
handles
function handles
11
João Miguel da Costa Sousa 466
Células de matrizes (Cell arrays)
�Uma cell array é uma matriz cujos elementos sãocélulas, com qualquer tipo de elementos.
cell 1,1 cell 1,2
cell 2,1 cell 2,2
−
150
602
731string.'a text is This'
−−
−+
4310
543
ii
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)
−
150
602
731
'This is a text string.'
[ ]
−−
−+
ii
i
4310
543
12
Joã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 72 0 60 5 1
João Miguel da Costa Sousa 469
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 função cell.
13
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)};
14
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} =
[]
João Miguel da Costa Sousa 473
Função cellplot
>> cellplot(b)
15
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
−
150
602
731
string.'a text is This'
−−
−+
4310
543
ii
i[ ]
cell 1,3
cell 2,3
cell 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
disp( ['Tempo gasto com prealocacao = ' num2str(toc)] );
16
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] [] []
João Miguel da Costa Sousa 477
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
17
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);
end % funcao teste1
18
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]
João Miguel da Costa Sousa 481
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);
error(msg);
19
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
>> plot_linha([0 0],[1 1],[2 4],[3 9],'k--')
20
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
João Miguel da Costa Sousa 485
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
21
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
zip
22
Joã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’
João Miguel da Costa Sousa 489
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: []
>> student(1)?
23
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
24
João Miguel da Costa Sousa 492
Exemplo de estrutura
studentstudent
.name
.addr1
.city
.state
.zip
.exams
.name.name
.addr1.addr1
.city .city
.state.state
.zip.zip
.exams.exams
'John Doe' 'Big Bird''Jane Q. Public'
'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)
João Miguel da Costa Sousa 493
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
25
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 tabelasseparadas. 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
26
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_aux estrutura(ii).(campo)];
end
João Miguel da Costa Sousa 497
Função calc_media.m
% Calcula media
media = mean(vector_aux);
% Devolve o numero de valores da media
if nargout == 2
nvals = length(vector_aux);
end
end % funcao calc_media
� Exemplo execução:>> [media,nvals] = calc_media(student,‘exams’)
media =
83.2222
nvals =
9
>> [media,nvals] = calc_media(student,‘zip’)
media =
50039
27
João Miguel da Costa Sousa 498
Tamanho e estruturas encadeadas
>> size(student)
ans =
1 3
>> size(student(1).name)
ans =
1 8
�Estruturas encadeadas (nested). Exemplo:
>> student(1).class(1).name = ‘Analise I’;
>> student(1).class(2).name = ‘Fisica I’;
>> student(1).class(1).instructor = ‘Mr. Jones’;
>> student(1).class(2). instructor = ‘Mr. Smith’;
João Miguel da Costa Sousa 499
Estruturas encadeadas: exemplo
>> student(1)ans =
name: ‘John Doe’
addr1: ‘123 Main Street’
city: ‘Anytown’;
state: ‘LA’
zip: ‘71211’
exams: [80 95 84]
class: [1x2 struct]
>> student(1).classans =
1x2 struct array with fields:
name
instructor
>> student(1).class(1)ans =
name: ‘Analise I’
instructor: ‘Mr. Jones’
>> student(1).class(2)ans =
name: ‘Fisica I’
instructor: ‘Mr. Smith’
>> student(1).class(2).nameans =
Fisica I
28
João Miguel da Costa Sousa 500
Organização de dados em estruturas
�Exemplo:
�Uma imagem a cores pode ser codificada:� Como uma estrutura 1x1 com três campos (imagens
de 128x128 correspondentes às componentes R, G, B)
� Uma matriz (128x128) de estruturas com três campos cada (os escalares R, G, B)
João Miguel da Costa Sousa 501
Células e estruturas
�As células são melhores que as estruturas nas seguintes aplicações:
1. Quando é necessário aceder a vários campos dos dados numa única instrução.
2. Quando se quer aceder a subconjuntos dos dados, como listas separadas por vírgulas.
3. Quando o conjunto de nomes de campos não é fixo.
4. Quando se retiram campos da estrutura de forma frequente.
29
João Miguel da Costa Sousa 502
Funções Handle
�Este tipo de dados guarda informação para ser utilizada mais tarde.
�Quando são criadas, as funções handle guardam toda a informação necessária para ser executada.
�Assim, a função pode ser executada mais tarde.
�São muito boas para Graphical User Interfaces.
João Miguel da Costa Sousa 503
Criação de funções handle
function res = my_func(x)
res = x.^2 – 2*x + 1;
end % funcao my_fun
� Criação da função handle para my_func:hndl = @my_func
hndl = str2func(‘my_func’);
>> hndl = @my_funchndl =
@my_func
>> hndl(4)ans =
9
>> my_func(4)ans =
9
>> h1 = @randn;>> h1()ans =
-0.4326
30
João Miguel da Costa Sousa 504
Utilização de funções handle
>> whos
Name Size Bytes Class
ans 1x1 8 double array
h1 1x1 16 function_handle array
hndl 1x1 16 function_handle array
Grand total is 3 elements using 40 bytes
>> feval(hndl,4)
ans =
9
>> func2str(hndl)
ans =
my_func
João Miguel da Costa Sousa 505
Função plot_funcao
function plot_funcao(funcao,pontos)
%PLOT_FUNCAO faz o grafico entre pontos especificados.
% Funcao PLOT_FUNCAO aceita uma funcao handle, e
% faz o grafico dessa funcao nos pontos especificados. (...)
% Variaveis:
% funcao -- Funcao handle
% msg -- Mensagem de erro
% Verifica se o numero de argumentos e' correcto
msg = nargchk(2,2,nargin);
error(msg);
% Vai buscar o nome da funcao
nome_func = func2str(funcao);
% Faz o grafico dos dados e coloca as legendas
plot(pontos,funcao(pontos));
title(['\bfPlot of ' nome_func '(x) vs x']);
xlabel('\bfx');
ylabel(['\bf' nome_func '(x)']);
grid on;
end % function plot_funcao
31
João Miguel da Costa Sousa 506
Exemplo de execução
>> plot_funcao(@sin,[-2*pi:pi/10:2*pi])
João Miguel da Costa Sousa 507
Vantagens das funções handle
�As funções handle podem ser passadas como argumentos de funções.
�Desempenho melhora quando as funções são executadas várias vezes.
�As funções privadas, encadeadas e as sub-funções podem ser acessíveis em qualquer parte se forem funções handle.
�Um M-file pode ter várias funções, se estas forem posteriormente definidas como funções handle.