• Nenhum resultado encontrado

Input/Output em Matlab

N/A
N/A
Protected

Academic year: 2021

Share "Input/Output em Matlab"

Copied!
31
0
0

Texto

(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’

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:

(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

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

(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

(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) (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

(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

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

(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;

(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

(11)

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 3

(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 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

(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} =

[]

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           − 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,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

(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] [] []

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);

(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]

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);

(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

(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

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’

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: []

(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

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

(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 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

(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_auxestrutura(ii).(campo)];

end

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).class

ans =

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).name

ans =

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)

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_func

hndl =

@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

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;

(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

Referências

Documentos relacionados

Sendo constituído: pelo Reitor, como Presidente, pelo Vice- Reitor, pelo Pró-Reitor de Ensino de Graduação, pelo Pró-Reitor de Pesquisa, Pós- Graduação e Inovação

Para qualificar as AEDs desse tipo, foi feita a identificação, por imagem de satélite, de sua localização no território, destacando-se o sistema viário e

Quanto ao segundo grupo focal, este demonstrou maior clareza no tocante ao tema, se comparado ao primeiro, porém, tal qual o primeiro, os estudantes expuseram

Quando um sensor de posição de trabalho estiver conectado ao terminal através do conector B, então você precisará comunicar ao terminal de acordo com qual princípio o sensor

“Lembre-se: se você faz aquilo que deve fazer no exato momento em que tem de ser feito, algum dia você poderá fazer tudo o que desejar, no momento em que desejar. Qualquer coisa

Na colheita, em 30/04/79, deter- minou-se o peso do caule, numero de vagens, peso das vagens sem sementes, número de se- mentes, peso das sementes e peso de 100 se- mentes por

cionais para a sua escrita musical durante a guerra, Ravel escolhe pela precisão e pelo ri- gor formal, tradicionais do classicismo fran- cês, como frente ao próprio instante político

Os debates abrangeram os temas Etnia e Saúde como área emergente, Política de Saúde Indígena no contexto do SUS, Perfil epidemiológico das popula- ções indígenas e sistema