Wykład 2 1. Jeszcze o macierzach 2. Instrukcje sterujące 3. M-pliki: skrypty i funkcje. Przykłady skryptów. Globalność zmiennych. Metody debuggowania. 4. Funkcje a. Struktura funkcji b. Zmienne nargin, nargout, zmienne lokalne, zmienne globalne c. Subfunkcje i funkcje prywatne. d. Pseudokompilacje funkcji, usuwanie funkcji z pamięci Przeszukiwanie macierzy >> A=[1 35; 467]; 1. find (A>3) 2. A>3 A=[17,0,-9;30,-2,38] A(A>1) ans = 17 30 38 Operator dwukropkowy WYŚWIETLANIE MACIERZY I ICH ROZMIARÓW disp(a)-wyświetla zawartość macierzy A w oknie poleceń; size(a)-rozmiar dwuwymiarowej macierzy A (liczbę wierszy i kolumn) w postaci dwuelementowego wektora wierszowego; size(a,1)- liczba wierszy macierzy A; size(a,2)- liczba kolumn macierzy A; length(x)-długość wektora x lub dłuższy z wymiarów macierzy. [n m]=size(a)-przypisuje zmiennej n liczbę wierszy, a zmiennej m liczbę kolumn; 1
FUNKCJE GENERUJĄCE I PRZEKSZTAŁCAJĄCE MACIERZE eye(n)-tworzy macierz jednostkową n x n; ones(n)-tworzy macierz n x n o elementach równych 1; zeros(n)-macierz zerowa n x n; rand(n)-macierz n x nwypełniona liczbami pseudolosowymi z przedziału <0,1> o rozkładzie jednostajnym; randn(n)-macierz n x nwypełniona liczbami pseudolosowymi o rozkładzie normalnym ze średnią 0 i wariancją 1. A=diag(x)-macierz przekątniowa A ze składnikami wektora x na głównej przekątnej; x=diag(a)-utworzenie wektora x z elementów znajdujących się na głównej przekątnej macierzy A; inv(a)-utworzenie macierzy odwrotnej do A; repmat(a,n,m)-utworzenie macierzy przez powielenie podmacierzy A mrazy w poziomie i n razy w pionie; reshape(a,n,m)-utworzenie macierzy o n wierszach i m kolumnach z elementów branych kolejno kolumnami z macierzy A; rot90(a)-obrócenie macierzy A o 90 stopni w kierunku przeciwnym do wskazówek zegara; tril(a)-utworzenie z macierzy A macierzy trójkątnej dolnej; triu(a)-utworzenie z macierzy A macierzy trójkątnej górnej. size(a) ans = 2 2 length(a) ans = 2 Zmiana kształtu macierzy C=reshape(A,2,3) C = 1 2 0 3 4 6 Funkcje logiczne służącedo badania własności całych macierzy exist('nazwa') isempty(x) issparce(x) isstr(x) isglobal(x) MACIERZE/TABLICE WIELOWYMIAROWE Matlab dopuszcza definiowanie macierzy wielowymiarowych. Odwoływanie się do elementów takich macierzy wymaga liczby indeksów większej niż 2. Pierwszy indeks-wiersz macierzy (wymiar 1); Drugi indeks-kolumna macierzy (wymiar 2); Trzeci indeks-strona macierzy (wymiar 3) Czwarty indeks-książka macierzy (wym. 4); Piąty indeks-tom macierzy (wym.5); itd.; 2
PRZYKŁAD Instrukcje sterujące Na rysunku widoczna jest macierz trójwymiarowa o rozmiarze 2x3x2 (2 wiersze i 3 kolumny na każdej stronie, 2 strony); >>D(:,:,1)=[1 3 0; 5 7 2] % str.1; >>D(:,:,2)=[4 7 8; 1 0 5] % str.2; kolumny wiersze IF if n>0.. (instrukcje) elseif n = = 0.. (instrukcje) else.. (instrukcje) Relacje i wyraŝenia logiczne Operatory porównania (np. przy instrukcji if..): A= =B A~ =B A<B A<=B A>B A>=B WHILE while prod(1:n)<10^100 n=n+1 FOR for i=1:n % i=[1:n] x(i)=0!!! Zamiast takiej pętli moŝna bardziej elegancko i szybciej zeros(1:n) SWITCH: SWITCH zmienna CASE wartość zmiennej, polecenia CASE {wartość1, wartość2, }... polecenia OTHERWISE, END polecenia Uwaga: W przeciwieństwie do języka C, Matlab wykonuje tylko pierwszy pasujący przypadek i nie sprawdza pozostałych. Dlatego nie jest uŝywana instrukcja break w=4; s=0.5; operator= * ; switch operator case + w=w+s; case { *,.* } w=w*s; case / w=w/s otherwise w=w-s; 3
Charakterystyka M-plików M-pliki Skrypty Nie posiadają argumentów wejściowych, ani wyjściowych Operują na danych w przestrzeni roboczej Wygodne, kiedy często należy wykonać sekwencję tych samych poleceń Funkcje Mogą posiadać argumenty wejściowe i wyjściowe Wewnętrzne zmienne są lokalne dla funkcji Wygodne do rozszerzenia MATLABA o własne aplikacje Edytor Matlaba Skrypty Wywołanie skryptu poprzez nazwę. Zmienne skryptu są przechowywane w pamięci jako zmienne globalne. Debuggowanie menu edytora Debug lub Breakpoints. Ewentualne wyświetlanie wartości zmiennych (brak średnika). Ciało funkcji: function b=oblicz(x) Funkcja % pomoc (help) do uzyskania po poleceniu help oblicz % jak wyzej (wolna linia) % komentarz programisty % chcemy uzyskać funkcję f(x)=sin(x 2 )/(x 2 -x) b=sin(x.^2)./(x.^2-x); % średnik zapobiega podwójnemu wyświetleniu wyniku wywołanie: >> oblicz(3) >> u=oblicz([1,3,8,7]) Uwagi: a) WaŜna jest nazwa pliku, a nie nazwa f-cji zadeklarowana wewnątrz pliku (nazwa funkcji do 31 znaków). b) Funkcja lookfor rozpoznaje słowa tylko z pierwszej linii. c) Wszystkie zmienne w funkcji są lokalne (zapominane po wyjściu sprawdzić na ćw.). d) Nie moŝna wewnątrz funkcji odwoływać się do zmiennych zewnętrznych. Z (c) i (d) wynika, Ŝe moŝna dublować nazwy zmiennych e) Funkcję moŝna wywoływać rekurencyjnie, ale patrz (c). 4
MoŜna zmienną zmienić na globalną. NaleŜy wewnątrz funkcji zadeklarować global nazwa_zmiennej. Wówczas zmienna jest pamiętana w kolejnych wywołaniach funkcji, ale nie jest pamiętana w przestrzeni roboczej i innych funkcjach lub skryptach. MoŜna to uzyskać deklarując global nazwa_zmiennej równieŝ tam. Wówczas jest to sama zmienna. clear global usuwa wszystkie zmienne globalne. Funkcja moŝe mieć kilka argumentów wejściowych Ilość argumentów wejściowych moŝe być zmienna Funkcja moŝe zwracać kilka argumentów wyjściowych przykład: [X,Y]=fun2(3), gdzie X i Y mogą być np. macierzami o innych wymiarach. function nasza1(x) Funkcja ze zmienną globalną: global a; % zmienna a weszła oknem. b=a+x; % bez poprzedniej linii program zgłosiłby błąd. Jaki? function nasza2(x) global a; b=a-x; >> global a; a=7; >>nasza1(4)*nasza2(3) =>11*4=44 MoŜna teraz zmieniać zmienną a bezpośrednio z przestrzeni roboczej bez konieczności edycji obu funkcji. Funkcja zwracająca 2 wartości: function [mean,stdev]=stat(x) [m,n]=size(x) if m= =1 m=n mean=sum(x)/m stdev=sqrt(sum(x-mean).^2/(n-1)) Przestrzeń robocza funkcji: KaŜda funkcja ma przydzieloną pamięć odseparowaną od przestrzeni roboczej Matlaba. Dlatego funkcje operują na zmiennych lokalnych. Po wywołaniu funkcji Matlab przekształca funkcję w pseudokod i zapamiętuje go, co przyspiesza wykonywanie funkcji. Pseudokod moŝna usunąć z pamięci komputera poleceniem: clear nazwa_funkcji clear functions usuwa wszystkie funkcje clear all usuwa wszystkie funkcje i zmienne wywołanie: >> [M,S]=stat(rand(10,1000)) Pseudokompilacja funkcji Do przyspieszenia działania duŝych programów z rozbudowanym interfejsem graficznym. Uruchomienie funkcji z Matlaba tak jak m-plik, ale nie moŝna po kompilacji zmieniać nazwy pliku zewnętrznie bo się nie uruchomi jako program. pcode nazwa_funkcji => p-plik Powstaje plik nazwa_funkcji.p Funkcje wewnętrzne M-pliki mogą zawierać kody więcej niŝ jednej funkcji. Funkcja zapisana jako pierwsza jest funkcją główna i jej nazwa pokrywa się z nazwą m-pliku. Zmienne wszystkich funkcji z tego samego m- pliku są nadal lokalne dla tych funkcji. Subfunkcje mogą być wywoływane tylko przez funkcje z tego samego m-pliku. 5
Przykład (Higham): function max_err=poly1err(n) % POLY1ERR(N) Błąd w interpolacji liniowej dowolnej funkcji (p=a*x+c; a=(f1-f0)/(1-0); c=f0) max_err=0; f0=f(0); f1=f(1); x=linspace(0,1,n); p=x.*f1+(1-x).*f0; err=abs(f(x)-p); max_err=max(max_err,err); ; % Subfunkcja function y=f(x) % Function to be interpolated, F(x) y=sin(x); Funkcje o zmiennej ilości argumentów wejściowych nargin (number of input arguments) - WE function y=wiele(x1,x2) if nargin = = 1 x2=10; y=sin(x1*x2); >> wiele(pi,2) =>sin(2 * pi)=0 >> wiele(pi/20) =>sin(pi/2)=1 nargout dotyczy sposobu wywołania funkcji (w innej funkcji lub oknie poleceń). Funkcje o zmiennej ilości argumentów wyjściowych nargout (number of output arguments) WY. Dotyczy sposobu wywołania funkcji (w innej funkcji lub oknie poleceń). function [y1,y2]=wiele_wy(x1,x2) if nargin = = 1 y1=sin(x1*x2) else y2=cos(x1*x2) >> sinusik=wiele_wy(pi,2) => sinusik=0 ; F-cja nawet nie oblicza y2 >> [sinusik,kosinusik]=wiele_wy(pi,2) => sinusik=0, kosinusik =1 W przypadku kiedy w deklaracji funkcji nie chcemy określić maksymalnej liczby argumentów wejściowych lub wyjściowych (zostawiamy pełną swobodę uŝytkownikom naszej funkcji) moŝna uŝyć funkcji: varargin varargout function wynik=nasza_funkcja(varargin) fprintf ('Number of arguments: %d\n',nargin); celldisp (varargin) >> nasza_funkcja(ones(1), jakis napis',pi) Number of arguments: 3 varargin {1} = 1 varargin {2} = jakis napis varargin {3} = 3.1416 Operacje na plikach (standardowa obsługa zmiennych) save nazwa_pliku nazwa_zmiennej save nazwa_pliku nazwa_zmiennej ascii load nazwa_pliku load nazwa_pliku zmienne (jeŝeli format.mat) save save plik save plik lista load load plik load plik.rozsz zapisuje binarnie wszystkie zmienne w pliku matlab.mat; zapisuje binarnie wszystkie zmienne w pliku o nazwie plik.mat; zapisuje binarnie w pliku o nazwie plik.mat tylko zmienne wymienione; wczytuje zmienne zapisane w pliku matlab.mat; wczytuje zmienne zapisane w pliku plik.mat; wczytuje zmienne zapisane w pliku tekstowym o podanej nazwie i dowolnym rozszerzeniu; dane muszą tworzyć tablicę prostokątną; zostaną zapisane w macierzy o nazwie plik; 6
who Your variables are: A a b B ans x save plik A B save plik.dat A -ascii clear A A??? Reference to a cleared variable A. load plik.dat who Your variables are: B ans plik a b x load plik.mat who Your variables are: A a b x B ans plik OPERACJE NA PLIKACH (Znak po znaku) Przed zapisaniem lub odczytaniem danych należy otworzyć plik za pomocą funkcji fopen: id_pliku=fopen(nazwa_pliku,rodzaj_dostępu) Wartość argumentu r w a r+ w+ a+ opis otwarcie pliku do odczytu usunięcie zawartości istniejącego pliku lub otworzenie nowego i otwarcie go do zapisu otwarcie pliku w celu dopisywania elementów na jego końcu otwarcie pliku do odczytu i zapisu usunięcie zawartości istniejącego pliku lub utworzenie nowego i otwarcie go do odczytu i zapisu otwarcie pliku w celu czytania lub dopisywania elementów na jego końcu Funkcja fopen otwiera plik wskazany łańcuchem nazwa_pliku i zwraca unikatowy identyfikator pliku (zmienną id_pliku). Identyfikator ten powinien być używany we wszystkich operacjach wejścia i wyjścia wykonywanych na danym pliku. Jeśli operacja otwarcia pliku zakończy się sukcesem, zmienna id_pliku będzie nieujemną liczbą całkowitą, w przeciwnym wypadku przyjmie wartość 1. Druga postać wywołania funkcji fopen jest następująca: [id_pliku,informacja]=fopen(nazwa_pliku,rodzaj_dostępu) informacjajest łańcuchem znakowym, który może być pomocny w ustaleniu błędu. Jest on zwracany kiedy operacja otwarcia pliku zakończy się niepowodzeniem. Zamknięcie pliku o podanym identyfikatorze: status=fclose(id_pliku) Zamknięcie wszystkich otwartych plików: status=fclose( all ) 7
W otwarytm pliku można wykonywać operacje odczytu lub zapisu za pomocą: fscanf fprint fwrite Przykład x = 0:0.1:1; y = [x; exp(x)]; fid = fopen('exp.txt','w'); fprintf (fid, %f, y); fclose(fid) dlmwrite A=['ala']; >> dlmwrite ('plik.txt', A) -> a,l,a >> dlmwrite ('cos.txt', A, '') -> ala >> save plik.txt' A ascii - Nieprzydatne przy łańcuchach 9.7000000e+001 1.0800000e+002 9.7000000e+001 Czytanie: Zapis (odczyt) łańcuchów do pliku textscan czyta plik tekstowy, zawartość przekazuje do zmiennej typu komórkowego cell dlmread(filename, delimiter, Row, Column) nie wszystkie konieczne. Odczyt danych numerycznych w trybie ASCII Import - export xlsread import danych z arkusza Excela A = xlsread('testdata2.xls', 1, 'A4:B5') % arkusz 1, komórki A4:B5 xlswrite d = {'Time', 'Temp'; 12 98; 13 99; 14 97}; s = xlswrite('tempdata.xls', d, 'Temperatures', 'E1') importdata s = importdata('ding.wav') s =data: [11554x1 double] fs: 22050 imread wczytanie grafiki >> a=imread('niebo.jpg'); >> image(a) % lub imagesc(a) skaluje wykres do pełnej mapy kolorów; Rysunek w oknie wykresów Matlaba imwrite zapis grafiki BW = imread('text.png'); imwrite(bw,'test.tif'); UWAGA: Przed nazwą pliku zawsze moŝe być adres URL 8