Comandos load e save - fenix.tecnico.ulisboa.pt · % Gera uma tabela de 10000 valores aleatorios e...

31
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’)

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.