% AISDT : podstawy programowania w rodowisku MATLAB
% Rozpocz cie ( MATLAB, cd) i zako czenie pracy w MATLABie (exit);
% Okna: komend, histori , przestrzeni roboczej, katalogu bie cego
% Szukanie informacji o programie i jego funkcjach: help, lookfor, okno MATLAB Help
% Edytor : wbudowany do MATLABa (uruchamianie: komenda edit lub File->New-> M-File)
% Orientacja macierzowa rodowiska (przy czym UWAGA: macierze indeksowane s od 1, nie od zera!)
% Elementami macierzy mog by liczby lub struktury
A=[1,2,3;4,5,6] % macierz 2 wiersze x 3 kolumny ; elementy wiersza rozdzielone przecinkami lub spacjami , rednik oznacza koniec wiersza
size(A) % rozmiar A; wynik : ans 2 3 ; ans - nazwa zmiennej zawieraj cej wynik ostatniej operacji .
clear(A) % usuwanie z pami ci zmiennej A; clear bez parametrów usuwa wszystkie zmienne (i funkcje).
s1= struct('pole1',[],'pole2',2,'pole3',rand(5)); % inicjalizacja struktury o 3 polach. Warto ka dego pola jest macierz ; mo e by równie macierz pust - warto niezdefiniowana, albo macierz o wymiarach 1x1- skalar.
% Odwołania do elementu macierzy
a=A(2,3) % Przy odwołaniu do elementu macierzy u ywane s nawiasy okr głe! Rozró niane s małe i du e litery.
a1=A(1,:)
% do zmiennej a1 zapisany pierwszy wiersz macierzy A
a2=A(:,2)
% zmienna a2 - druga kolumna macierzy A
b=s1.pole2
% do zmiennej b przypisana zostaje warto 'pole2' struktury s1 (tu: b=2).
A=A(2,3) % Instrukcja podstawienia powoduje aktualizacj rozmiaru obiektu (tu: zmniejszenie A do wymiaru 1x1)
% Mo liwo dynamicznej zmiany rozmiarów macierzy bez konieczno ci wcze niejszej deklaracji (np. przez podstawienie nieistniej cego elementu)
A(4,5)=10 % Takie podstawienie powoduje zwi kszenie rozmiarów A (i wyzerowanie niezdefiniowanych elementów) S(5)=struct('key',5,'value',[0:4]) % S5 - tablica struktur. Je li ju istniała to musiała mie zdefiniowane pola 'key' i 'value', je li nie istniała to zostaje utworzona 5-elementowa tablica struktur zawieraj cych takie pola, przy czym: dla i=1...4
s(i).key i s(i).value nie maj przypisanych warto ci, s(5).key=5 s(5).value= [0 1 2 3 4]
S=[S,s1] - powi kszenie tablicy struktur S o jedn pozycj zwieraj c struktur s1 (s1 dopisane na ko cu S)
% Nie mo na si odwoła do elementu spoza aktualnego zakresu indeksów macierzy a=A(6,7) % pojawia si informacja o bł dzie: ??? Index exceeds matrix dimensions.
% Przydatne kreatory tablic
A=zeros(3);
% Macierz 3x3 z zerami; rednik na ko cu blokuje wy wietlanie wyniku operacji na ekranie B=rand(3)
% Macierz 3x3 z liczbami pseudolosowymi z przedziału (0.0,1.0),wektor tworzy si przez: rand(n,1) C= ceil( (rand(1,n)-0.5)*2*r))
% n-elementowy wektor całkowitych liczb losowych z zakresu (-r,r>.
N=linspace(0,1,11) % wektor wierszowy (1x11) liczb równo rozło onych w przedziale <0.0,1.0> tzn. : 0 0.1 0.2 .... 0.9 1
M=0:0.1:1
% wektor wierszowy (tu: M=N) utworzony z ci gu liczb od 0 do 1 z krokiem 0.1: 0 0.1 0.2 0.3 ... 0.9 1
% Działania matematyczne + - * / * .* ./ .* ‘ ^
1 2
1 2
5
4
A=[ 1, 2; 3, 4 ]; B=[1,2; 2,1];
A =
, B =
, A ∗ B =
,
A+B
3 4
2 1
11 10
B-A
A*B
1 4
1
1
1 3
B*A
.
A ∗ B
=
, .
B / A =
, AT =
A^2
% mno enie macierzowe A*A
6 4
2 / 3 1/ 4
2 4
A.*B, A.^2
% mno enie element po elemencie
B./A
% dzielenie element po elemencie
1 2
3
0
.
1 000
AT=A’ % transpozycja macierzy A
A =
b =
x =
% Układy równa A*x=b (lewe dzielenie \)
3 4
7
0
.
1 000
b=sum(A,2)
% Wektor b tworzony jest z sum wierszy macierzy A
x=A\b
% Rozwi zanie układu A*x=B
format long; x % wy wietla x z dok. 15 cyfr, powrót do 5 cyfr: format short
% Proste wykresy (patrz help do funkcji: plot, semilogx, semilogy, loglog) x=linspace(-2,2,21); y1=x; y2=x.^2; y3=x.^3; y4=x.^4;
plot(x,y1,’b-o’,x,y2,’r-x’); xlabel(‘x’); ylabel('warto ci funkcji'); title(‘Pierwsze wykresy’); pause % zatrzymanie programu (potrzebne przy pracy z m-plikiem), dalsze dział. po wci ni ciu dowolnego klawisza hold on
% wł czenie dodawania nowych wykresów do bie cego okna wykresów
plot(x,y3,’-v’,x,y4,’-s’); hold off % po hold off nowy wykres b dzie rysowany w uprzednio wyczyszczonym oknie legend(‘y=x’,’y=x^2’,’y=x^3’,’y=x^4’)
% opis wykresów
grid on % dodanie siatki, grid off -usuni cie siatki figure % dodanie nowego okna wykresów o kolejnym (pierwszym wolnym) numerze
% Skrypty i funkcje
Skrypty, to pliki tekstowe o rozszerzeniu m b d M, zawieraj ce polecenia i instrukcje MATLABa. Skrypty nie pobieraj adnych argumentów wej ciowych, ani nie zwracaj argumentów wyj ciowych; działaj na zmiennych głównej przestrzeni roboczej (workspace). Skrypt uruchamia si podaj c jego nazw (bez rozszerzenia) w wierszu polece MATLABa b d w innym skrypcie. Uruchamiany skrypt musi by w bie cym katalogu lub na cie ce poszukiwa interpretera (path).
Funkcja - m-plik o postaci:
function [ lista_parametrów_wyj ciowych ]=nazwa_funkcji( lista_parametrów_wej ciowych )
% NAZWA_FUNKCJI - krótka instrukcja u ycia (dla polecenia help nazwa_funkcji) Ciało funkcji
Funkcje akceptuj parametry wej ciowe. W trakcie oblicze działaj na parametrach wej ciowych i zmiennych utworzonych we własnej przestrzeni roboczej, niedost pnej z wiersza polece . Funkcja mo e wyznacza warto ci parametrów wyj ciowych – zwracanych do nadrz dnej przestrzeni roboczej (w której kontek cie wywołano funkcj ).
Uwaga: zmienne w funkcji s z definicji lokalne. Dost p do tych zmiennych z przestrzeni roboczej zapewnia deklaracja global (trzeba jej u y w 2 miejscach: zarówno w funkcji, jak i w wołaj cym funkcj skrypcie) Przykład 1: skrypt mno cy dwie kwadratowe macierze Przykład 2: badanie zło ono ci obliczeniowej mno enia losowe o zadanym rozmiarze zwracaj cy ilo mno e i macierzy (same mno enia lub mno enia i dodawania dodawa
ł cznie)
%%%%%% plik mul_test.m - (skrypt) %%%%%
%%%%%% plik mul_check.m - to jest skrypt %%%%%
n=5;
clear;
[a, m] = mul_fun(n);
N=5:5:50; % lub: N=linspace(5,50,10);
fprintf(1,'liczba_dodawa =%g, liczba mno e =%g',a,m); % p tla dla ró nych wymiarów macierzy
% formatowany komunikat na ekranie
for i=1:size(N,2)
[a(i), am(i) ]= mul_fun(N(i));
%%%%% plik mul_fun.m - to jest funkcja %%%%%% end; function [t1, t2] = mul_fun(n)
% Wykresy
A=rand(n); B=rand(n);
figure(1); hold off;
N_add=0; N_mul=0; % warto ci pocz tkowe
plot(N,a,'g-o',N,a+am,'m--*'); legend ('dodawania', 'ł cznie'); for k1=1:n
xlabel('rozmiar macierzy'); ylabel('liczba oper. domin.'); for k2=1:n
title('Zło ono obliczeniowa mno enia macierzy'); grid on s=0.0;
figure(2); hold off; % ten sam rys. w skali logarytmicznej for k3=1:n
loglog(N,a,'g-o',N,a+am,'m--*'); legend ('dodawania',
s=s+A(k1,k3)*B(k3,k2);
'ł cznie');
N_add=N_add+1;N_mul=N_mul+1; xlabel('rozmiar macierzy'); ylabel('liczba oper. domin.'); end
title('Zło ono obliczeniowa mno enia macierzy')
D(k1,k2)=s;
end
%% WYNIKI poni ej
end
%% PROSZ wiadomie obejrze wykres funkcji pot gowej
w skali logarytmicznej !
Uwaga! Prosz zwróci uwag na sposób wywołania funkcji zwracaj cej wi cej ni 1 par. wyj ciowy. Aby uzyska warto ci wszystkich parametrów zwracanych przez funkcj , KONIECZNIE przed znakiem '=' musi wyst pi nawias kwadratowy z list zmiennych, do których podstawione zostan obliczone warto ci.
Uwaga do uwagi - oczywi cie zmienna oznacza macierz, nawet bardzo długi wektor jest jedn zmienn !
Zło ono obliczeniowa mno enia macierzy
zło ono
obliczeniowa mno enia macierzy
x 105
2.5
106
dodawania
dodawania
dodawania i mno enia ł cznie
dodawania i mno enia ł cznie
2
105
cych
cych
inuj 1.5
inuj
mo
mo 104
racji de
racji d
p
1
ep
a o
a o
liczb
liczb 103
0.5
00
10
20
30
40
50
102
rozmiar macierzy
100
101
102
rozmiar macierzy
Kilka praktycznie u ytecznych uwag o programowaniu w MATLABie 1. Operatory MATLABa (help ops): porównania ( == , ~= , < , > , <= , >= ), logiczne ( |, &, ~ ), arytmetyczne (standardowe oraz specyficzne dla MATLABA \, .* , .^, ./). Uwaga: operatory porównania działaj pewnie na liczbach całkowitych!
2. Ka da instrukcja warunkowe (if , switch) i tworz ca p tle (for, while,) musi by zako czona przez end 3.
rednik na ko cu linijki nie jest obowi zkowy, je li wyst puje, to wynik operacji nie jest wy wietlany na ekranie 4. Działaj cy program mo na przerwa przez ^C
5. W przypadku bł du programu nale y czyta komunikaty na ekranie!
6. Nale y u ywa funkcji, zwłaszcza wbudowanych, gdy tylko to jest mo liwe (istotnie przy piesza działanie programu!)
- w szczególno ci min, max, (mog zwraca równie indeks ekstremum), sum, linspace 7. Uruchamianiu programu sprzyja testowanie go etapami, w szczególno ci: a) dobrze jest sprawdzi działanie funkcji jako skryptu (z wykomentowan 1-sz linijk ) - zapewnia to łatwy dost p do wszystkich (w skrypcie globalnych) zmiennych
b) do testowania nale y u ywa danych o małych rozmiarach, dla których znane jest prawidłowe rozwi zanie 8. Je eli w zadaniu wymagany jest wykres, to najpierw nale y (najcz ciej w p tli w której zmienia si rozmiar zadania) wygenerowa potrzebne dane, a potem zaj si grafik . Je li wyniki s zapisane nie po kolei - np. znajduj si w wektorze res na pozycjach 2,4,6 9 (czyli res=[0 d1 0 d2 0 d3 0 0 d4] ), to te łatwo je wykre li : a) albo wprost wypisuj c indeksy: plot( [2,4,6,9] , res( [2,4,6,9] ) ) b) albo definiuj c wektor pomocniczy: nx=[2,4,6,9]; plot(nx , res(nx) )