CURS_56_ECNI.pdf

download CURS_56_ECNI.pdf

of 10

Transcript of CURS_56_ECNI.pdf

  • CURS 5+6

    1

    CURS 5+6 ECNI

    FUNCII DE CONTROL LOGIC

    Funciite de control logic n MATLAB sunt:

    exist Verific dac variabilele sau funciile argument sunt definite;

    any Testeaz dac cel puin un element al unei matrice verific o condiie logic;

    all Testeaz dac toate elementele unei matrice verific o condiie logic;

    find Returneaz indicii elementelor diferite de zero;

    isnan Testeaz dac elementele unei matrice sunt NaN (not-a-number);

    isinf Testeaz dac elementele unei matrice sunt infinite;

    finite Testeaz dac elementele unei matrice sunt finite.

    MATLAB-u! conine funcii pentru testarea unor condiii relaionale i logice n tablouri de date sau matrici. Acestea sunt des utilizate asociate cu instruciunea if.

    1. Testarea condiiilor logice

    Funcia any testeaz dac un vector are cel puin un element diferit de zero; returneaz 1 dac condiia este verificat i 0 n caz contrar. n cazul matricelor, funcia any opereaz pe coloane, returnnd un vector linie cu elemente 0 i 1 care respect condiia de mai sus. Pentru fiecare coloan este returnat cte un element. Se apeleaz cu sintaxa:

    Y=any(X)

    Funcia all testeaz dac un vector are toate elementele diferite de zero; returneaz 1 dac condiia este verificat si 0 n caz contrar. n cazul matricelor, funcia all opereaz pe coloane, returnnd un vector linie cu elemente 0 si 1 care respect condiia de mai sus. Pentru fiecare coloan este returnat cte un element. Se apeleaz cu sintaxa:

    Y=all(X)

    Funciile any i all sunt utile mai ales n expresii de tip if. Spre exemplu, structura MATLAB:

    if all(A

  • Elemente de calcul numeric ingineresc

    2

    permite realizarea calculelor prevzute n instruciuni pentru toate elementele care ndeplinesc condiia A < 0.5.

    Exemplul 1. Fie 1 0 40 0 50 0 8

    X =

    . S se determine:

    - coloanele n care matricea are cel puin un element diferit de zero;

    - coloanele n care matricea are toate elementele diferite de zero;

    - coloanele n care matricea are ce! puin un element mai mare ca -1. Cu secvena MATLAB:

    X=[l 0 4;0 0 5;0 0 8]

    A=any(X)

    B=all(X)

    C=any(X>-1)

    se obin rezultatele:

    A = [1 0 1]

    B = [0 0 1]

    C = [1 1 1 ]

    2. Determinarea indicilor elementelor care verific o condiie

    Funcia find returneaz indicii elementelor diferite de zero sau care verific o condiie impus de utilizator. Se apeleaz cu una dintre sintaxele:

    a=find(X) [b,c]=find(X) [b, c, V]=find(X)

    Dac argumentul X este un vector, prima form returneaz indicii elementelor lui X care sunt diferii de zero. Dac argumentul este o matrice, funcia find analizeaz coloan cu coloan, indicii returnai ca rezultat avnd valorile cuprinse n intervalul 1 ... mxn (pentru o matrice cu m linii si n coloane). A doua form de apelare returneaz numrul liniei (vectorul b) i al coloanei (vectorul c) matricei argument X care conin elemente diferite de zero. A treia form de apelare returneaz n plus si vectorul V al elementelor diferite de zero (elimin elementele egale cu zero).

    n unele situaii este necesar determinarea poziiei indicilor unor elemente dintr-o matrice care ndeplinesc o condiie, de exemplu sunt mai mari sau mai mici dect o valoare dat. Astfel structura MATLAB: i=find(x>=a) returneaz indiciii elementelor X mai mari sau egali cu a.

    3. Determinarea poziiei elementelor finite, infinite sau NaN

    Determinarea poziiei elementelor finite se face cu funcia finite, se apeleaz cu sintaxa:

  • CURS 5+6

    3

    Y=finite(X)

    care returneaz o matrice Y de aceleai dimensiuni cu matricea argument X, cu elementele 1 pe poziia n care elementele matricei X sunt numere finite i zero n caz contrar.

    Determinarea poziiei elementelor NaN (Not-a-Number) se face cu funcia isnan; se apeleaz cu sintaxa:

    Y=isnan(X)

    care returneaz o matrice Y de aceleai dimensiuni cu matricea argument X, cu elementele 1 pe poziia n care elementele matricei X sunt NaN i zero n caz contrar. NaN (Not-a-Number) este rezultatul mpririi 0/0, de exemplu.

    Determinarea poziiei elementelor infinite se face cu funcia isinf, se apeleaz cu sintaxa:

    Y=isinf(X)

    care returneaz o matrice Y de aceleai dimensiuni cu matricea argument X, cu elementele 1 pe poziia n care elementele matricei X sunt Inf i zero n caz contrar.

    Exemplul 2. S se scrie o secven de program care nlocuiete elementele NaN cu elemente zero n vectorul x=[0 2 NaN -89 Inf NaN]. Cu urmtoarea secven:

    x=[0 2 NaN -89 Inf NaN]; i = find (isnan (x) ) ; x(i) = zeros (size (i) )

    se obine rezultatul:

    x = [0 2 0 -89 Inf 0]

    4. Testarea matricelor goale

    Testarea unei matrice dac este goal se face cu funcia isempty; se apeleaz cu sintaxa:

    v=isempty(X) care returneaz 1 dac matricea X este goal i zero n caz contrar.

    5. Testarea existenei unei variabile

    Testarea existenei unei variabile sau a unui fiier se face cu funcia exist, se apeleaz cu sintaxa:

    v=exist('nume_variabil') care returneaz urmtoarele valori:

    0 - dac nu exist; 1 - dac exist ca o variabil n spaiul de lucru; 2 - dac exist ca un fiier-M pe disc; 3 - dac exist ca un fiier-MEX pe disc; 4 - dac exist ca funcie SIMULINK; 5 - dac exist ca funcie MATLAB intern.

    Numele variabilei trebuie s fie scris ntre apostrofuri, fiind ir de caractere. Funcia exist se poate

  • Elemente de calcul numeric ingineresc

    4

    introduce ntr-un program pentru a testa dac anumite fiiere exist pe disc, atunci cnd se lanseaz un program. De exemplu secvena:

    h=exist('test')

    if h= =0

    error('Lipsete fiierul test.m')

    end

    verific existena fiierului test.m i returneaz un mesaj de avertizare dac acesta nu exist.

    VECTORIZAREA CALCULELOR

    Deoarece operaiile cu vectori i matrici sunt executate n MATLAB mai repede cu un ordin de mrime dect operaiile compilate/interpretate, se obine o vitez de lucru mai mare dac algoritmii nscrii n fiierele-M sunt vectorizai. Oriunde este posibil, ciclurile for i while trebuie convertite n operaii cu vectori sau matrici.

    Spre exemplu, programul care calculeaz sinusul n 1000 de puncte (de la 1 la 10, cu pasul .01), utiliznd bucla for.

    t=0:0.01:10; N=length(t)

    for i=1: N,

    y(i)=sin(t(i)) ;

    end

    plot (t, y)

    are versiunea vectorizat:

    t=0:0 .01:10;

    Y=sin(t);

    plot (t, Y)

    Primul exemplu necesit un timp de 10-15 ori mai mare dect cel de-al doilea.

    n cazurile n care nu se poate vectoriza o parte din program, pentru a face ca ciclurile s fie executate mai repede, se procedeaz la prealocarea unor vectori n care vor fi reinute rezultatele. De exemplu, incluznd o prim instruciune de prealocare folosind funcia zeros, ciclul for urmtor se execut semnificativ mai repede:

    y=zeros (1,100);

  • CURS 5+6

    5

    for i=1:100

    y(i)=det(x^i);

    end

    Explicaia const n faptul c dac nu se face prealocarea, interpretorul MATLAB trebuie s redimensioneze vectorul y la o dimensiune mai mare, de fiecare dat cnd trece printr-o iteraie a ciclului. Dac vectorul este prealocat, acest pas este eliminat si execuia este mai rapid.

    Pentru lucrul cu matrici mari pe computere cu memorie limitat, prealocarea are un al doilea avantaj: utilizarea memoriei mult mai eficient i lansarea programelor fr a depi memoria. Prealocarea ajut inclusiv la reducerea fragmentrii memoriei; o memorie fragmentat n cursul sesiunii MATLAB poate deveni insuficient ca spaiu continuu necesar memorrii variabilelor mari.

    OPERAREA CU IRURI DE CARACTERE

    Constanta ir se reprezint printr-un ir de octei n care se pstreaz codurile ASCII ale caracterelor irului respectiv. Codurile ASCII 0-31 sunt caractere negrafice, iar codurile 32-127 sunt caractere grafice. Un ir de caractere este constituit din unul sau mai multe caractere delimitate prin apostrofuri. Apostrofurile nu fac parte din irul de caractere.

    n acest capitol al cursului se prezint declararea irurilor de caractere, compararea acestora, conversia irurilor n numere i a numerelor n iruri, evaluarea expresiilor MATLAB din iruri concatenate etc.

    1. Funcii generale

    Funciile MATLAB folosite pentru operarea cu iruri de caractere sunt:

    abs Convertete irurile de caractere n valorile numerice ale codului ASCII;

    setstr Convertete valorile numerice ale codului ASCII n caractere;

    strings Declar o variabil ca ir de caractere;

    isstr Detecteaz dac o variabil este ir de caractere;

    str2mat Formeaz matrice text din iruri de caractere;

    blanks Creeaz spaii ntre irurile de caractere;

    deblank Elimin spaiile libere dintre irurile de caractere;

    eval Evalueaz irurile de caractere cu expresii MATLAB;

    feval Evalueaz funciile MATLAB.

    Funcia abs convertete irurile de caractere la valorile numerice ale codului ASCII; se apeleaz cu sintaxa:

  • Elemente de calcul numeric ingineresc

    6

    y=abs('sir_de_caractere')

    Exemplul 3. S se determine codurile ASCII ale irului de caractere MATLAB". Cu secvena :

    y=abs('MATLAB') .

    se obine: y = [77 65 84 76 65 66]

    Funcia setstr seteaz indicatorul ir de caractere; se apeleaz cu sintaxa:

    s=setstr(t)

    Rezultatul s este un ir de caractere ASCII care corespund valorilor numerice t. Caracterele ASCII care se pot tipri sunt ntregi n intervalul 32...127 sau n intervalul 0...255 dac se folosesc 8 bii; n afara acestui interval, numerele sunt rotunjite la ntregi modulo 256.

    Exemplul 4. S se afieze caracterele ASCII grafice (codurile ASCII 32-127), ntr-o matrice 3x32. Cu secvena MATLAB:

    ascii=setstr(reshape(32:127,3,32))

    se obine rezultatul:

    ascii=

    #&),/258;>ADGJMPSVY\_behknqtwz}

    !$'*-0369

  • CURS 5+6

    7

    Numrul de linii al matricei S este egal cu numrul de iruri individuale, iar numrul de coloane este egal cu dimensiunea celui mai mare ir component. Prin acest procedeu se pot construi matrice cu pn la 11 iruri. De asemenea, fiecare argument de intrare, poate fi la rndul lui o matrice ir, fiind posibil operarea cu matrici ir de dimensiuni mari.

    Exemplul 5. Creai o matrice ir cu subirurile: 'MATLAB-ul', 'este un pachet de programe', 'de nalt performan.'. Cu secvena:

    S=str2mat ('''MATLAB-ul''','este un pachet de programe', 'de nalt performan') se obine rezultatul:

    'MATLAB-ul'

    este un pachet de programe

    de nalt performan.

    Funcia blanks se folosete pentru afiarea irurilor la anumite poziii sau pentru crearea unor spaii ntre iruri; se apeleaz cu sintaxa:

    blanks(n)

    care deplaseaz cursorul cu n caractere spre dreapta (n numr ntreg pozitiv). De cele mai multe ori se folosete asociat cu funcia disp i permite controlul liniei i coloanei n care se face afiarea unui ir.

    Funcia deblank elimin spaiile libere i orice caracter nul (cele cu valoarea absolut 0) de la sfritul unui ir de caractere; se apeleaz cu sintaxa:

    deblank(S)

    Funcia eval interpreteaz irurile de caractere coninnd expresii MATLAB; se apeleaz cu una dintre sintaxele:

    x=eval('ir_de_caractere') eva/('ir_de_caractere')

    Dac 'ir_de_caractere' este o expresie MATLAB, aceasta este interpretat. De cele mai multe ori 'ir_de_caractere' concateneaz mai multe subiruri i variabile cuprinse ntre paranteze drepte, construindu-se expresii MATLAB n programe complexe.

    Exemplul 6. S se evalueze expresia: y=2x2 +3, folosind funcia eval. Cu secvena MATLAB:

    x=3; z='2*x^2+3'; y=eval(z)

    se obine rezultatul: y=21

    Exemplul 7. S se genereze 3 matrice cu elemente numere aleatoare cu numele testl, test2, test3.

    Secvena corespunztoare este:

    for n = 1:3 .

  • Elemente de calcul numeric ingineresc

    8

    eval(['test' int2str(n) '=rand(4,4)'])

    pause

    end

    Funcia feval permite evaluarea funciilor; se apeleaz cu una dintre sintaxele :

    feval ('nume_funcie', x1.....xn)

    [y1,...,ym]=feval('nume_funcie', x1,.... xn) unde:

    nume_funcie - este un argument ir, care specific numele funciei de evaluat; xl,... xn - sunt argumentele de intrare; y1,...,ym - sunt argumentele de ieire.

    Spre exemplu, funcia test.m cu dou argumente de intrare i un argument de ieire, se apeleaz cu sintaxa:

    y=feval('test', x1, x2)

    2. Compararea irurilor de caractere

    Funciile MATLAB folosite pentru compararea irurilor de caractere sunt:

    strcmp Compar iruri de caractere;

    findstr Caut un ir de caractere ntr-un alt ir de caractere;

    upper Convertete literele unui ir de caractere la litere mari;

    lower Convertete literele unui ir de caractere la litere mici;

    isletter Verific dac elementele unui vector sunt sau nu literele alfabetului;

    Compararea, a dou iruri de caractere se face cu funcia strcmp, care se apeleaz cu sintaxa:

    a=strcmp(S1,S2)

    Returneaz 1 dac acestea sunt identice i 0 n caz contrar. Funcia lucreaz n modul senzitiv, incluznd n procesul de comparare spaiile dintre caractere i tipul caracterelor - mari sau mici - folosite la scriere.

    Exemplul 7. Comparai irurile test" i Test" i afiai rezultatul. Cu secvena MATLAB:

    a=strcmp('test','Test') .

    se obine rezultatul : a=0

    Cutarea unui ir de caractere, S2, ntr-un alt ir de caractere, S1, se face cu funcia findstr, care se apeleaz cu sintaxa:

    M=findstr{S1, S2) Rezultatul M conine poziiile de la care ncepe irul S2 n irul S1.

  • CURS 5+6

    9

    Exemplul 8. S se gseasc poziia irului de caractere S2='test' n irul de caractere S1='Acest test este interesant'. Cu secvena:

    Sl='Acest test este interesant '; S2='test '; M=findstr (S1, S2) se obine rspunsul: M = 7

    Conversia literelor mici dintr-un ir de caractere, n litere mari, se face cu funcia upper, care se apeleaz cu sintaxa: t=upper(s)

    iar conversia invers, a literelor mari n litere mici se face cu funcia lower, care se apeleaz cu sintaxa: t=lower(s)

    Determinarea literelor alfabetului dintr-un ir de caractere se face cu funcia isletter, care se apeleaz cu sintaxa: A=isletter(S)

    Rezultatul conine 1 in poziiile n care elementele irului sunt litere si 0 n celelalte poziii (numere, blank-uri, etc.).

    Exemplul 8 Determinai poziiile n care se gsesc literele din irul 'Azi este 30.10.2006'. Cu secvena:

    S='Azi este 15.09.1995'; A=isletter (S)

    B=find(A==l) se obine rezultatul:

    A = [1 1 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0] B = [1 2 3 5 6 7 8]

    3. Conversia ir-numr i mumr-ir

    Funciile MATLAB folosite pentru conversia numerelor n iruri de caractere sunt:

    num2str Convertete un numr ntr-un ir de caractere;

    int2str Convertete un numr ntreg ntr-un ir de caractere;

    str2num Convertete un ir de caractere ntr-un numr;

    sprintf Convertete un numr ntr-un ir sub controlul formatului

    Conversia numerelor n iruri de caractere este utilizat la introducerea valorilor numerice n titluri, la etichetarea axelor etc. Se face cu funcia num2str care se apeleaz cu sintaxa:

    s=num2str(x)

    Funcia int2str convertete numerele ntregi n iruri de caractere; se apeleaz cu sintaxa :

    s=int2str(r)

    Funcia str2num convertete irurile care au caracterele ASCII ale valorilor numerice, n numere; se apeleaz cu sintaxa : x=str2num(s)

  • Elemente de calcul numeric ingineresc

    10

    irurile pot conine: numerele zecimale 0...9, semnale + si -, punctul zecimal, caracterul e urmat de un numr (puterea lui 10), precum i caracterele i i j pentru numerele complexe.

    Funcia sprintf scrie datele din matricea (sau vectorul) A sub controlul formatului; se apeleaz cu sintaxa:

    s=sprintf('format', A, ... )

    Parametrul de control, irul format", conine specificaia de conversie i poate fi de forma :

    %-d.p tip_format unde :

    - semnul minus este opional si specific alinierea la stnga (dac lipsete, alinierea se face la dreapta);

    - d este numrul minim de cmpuri (cifre) afectate datei respective;

    - p este numrul de cmpuri folosite pentru partea zecimal;

    - tip_format poate fi unul dintre caracterele :

    e - notaia exponenial; f - notaia n virgul fix;

    g - formatele scurte ale lui e sau f (tar zerourile nesemnificative). Caracterele de control admise de MATLAB sunt :

    \n - linie nou; \f - form feed;

    \t - tab orizontal; \\ - backslash;

    \b - backspace; \ - aprostrof.

    \r - carriage retum (la cap de rnd);

    Exemplul 9. Conversia numrului ti n ir de caractere se face cu secvena:

    s=num2str (pi) obinndu-se rezultatul : s=3.142

    Exemplul 10. S se introduc n titlul unui grafic o valoare numeric rezultat dintr-un calcul. Cu secvena :

    a=2; b=8; s=a+b;

    title( [ 'Viteza este ', int2str(s),' m/s']) se obine titlul graficului: Viteza este 10 m/s"