46 4 ELEMENTY JĘZYKA MATLAB
vname = eval([fname,int2str(i)]); feval(’disp’,vname), disp(’ ') end
Wywołanie M-pliku ldane.m powoduje wprowadzenie do przestrzeni roboczej zmiennych leql i leq2, którym przypisuje się macierze przechowywane w plikach leql.dat, leq2.dat. Rezultat działania M-pliku ldane.m podano poniżej:
plików |
z |
danymi |
? 2 | |
20 |
3 |
2 |
1 |
18 |
2 |
25 |
1 |
1 |
-23 |
3 |
1 |
40 |
1 |
41 |
1 |
1 |
2 |
25 |
-23 |
9 |
3 |
3 |
5 |
4 |
4 |
11 |
1 |
6 |
-11 |
5 |
1 |
6 |
3 |
7 |
2 |
4 |
2 |
8 |
-8 |
4.2.2 Definicja procedur i funkcji czyli M-pliki funkcyjne
M-pliki funkcyjne (ang.function file) zawierają procedury i funkcje tworzone przez użytkownika. Działają one na zmiennych lokalnych i komunikują się z przestrzenią roboczą poprzez parametry formalne.
M-pliki funkcyjne muszą rozpoczynać się od słowa kluczowego function. Muszą zawierać również nazwę funkcji i nawiasy okrągłe obejmujące listę argumentów wejściowych. Pierwsza linia M-pliku funkcyjnego powinna być zapisana następująco:
function [lista argumentów wyjściowych] = nazwaJunkcji (lista argumentów wejściowych)
Zwraca się uwagę, że nazwa funkcji musi być taka sama jak nazwa M-pliku (bez rozszerzenia), w którym tą funkcję zapisano. Argumenty wejściowe i wyjściowe na listach, oddziela się przecinkami. Funkcja może nic mieć żadnych argumentów (ani wejściowych ani wyjściowych). Wtedy nawiasy okrągłe obejmują listę pustą.
Jeśli, na przykład, polecenia zawarte w pliku skryptowym ldane.m zapiszemy jako funkcję bczparametrową o nazwie ldanef to zawartość pliku ldanef .m będzie następująca:
łurn i łon ldanef ( )
fimme ’leq’; n = inputOlle plików z danymi ? ’); for i * 1 :n
«w<il,(C’10ftd ',fname, int2str(i), ’ .dat ’] ) vn >mo *>val( [fname ,int2str(i)] ) ; i - < I (*«I iop’,vname), disp(’ '), end
l nul « |n ldanef może być użyta jedynie do kontroli wprowadzania danych
* plilfw o nazwie leq, poprzez wypisanie ich zawartości na ekranie. W ■ -li..'tu. mu od pliku ldane.m. funkcja ldanef nie wprowadza zmiennych ||ii pi /i 11 żeni roboczej MATLAB-a.
Ai i.iimenty wejściowe i wyjściowe oraz wszystkie zmienne używane we-n im11 limkcji mają. charakter lokalny. Oznacza to, że nie posiadają one iMdim li powiązań ze zmiennymi z przestrzeni roboczej, nawet jeżeli ich na-mo t nlmtyczne. Zasada ta nie dotyczy następujących przypadków:
• gdy zmienne lokalne są definiowane za pomaca nazw wartości specjalnych (tabela 2.2),
• gdy zmienne są zadeklarowane jako globalne za pomocą polecenia global.
Wartości zmiennych wyspecyfikowanych po poleceniu global są 'widziane zarówno w przestrzeni roboczej jak i wewnątrz wywoływanej funkcji. Ji-.l to źródłem wielu błędów wykonania trudnych do wykrycia. Ponadto, u i/rlkie modyfikacje lub stosowanie w innych programach algorytmów pisanych z wykorzystaniem takich zmiennych jest bardzo trudne. Dlatego zaleca n; zrezygnowanie z używania zmiennych globalnych, a co najmniej znaczne
• •graniczenie ich ilości.
Poniżej zamieszczono przykład M-pliku funkcyjnego, w którym zapi-auo algorytm rozwiązywania układu algebraicznych równań liniowych w postaci A * x = b. Przy czym: A jest macierzą współczynników układu równań, b reprezentuje wektor wyrazów wolnych, x to szukany wektor rozwiązań. Istnieje wiele metod rozwiązywania tego typu układów równań. Jedna z bardziej efektywnych polega na poszukiwaniu takich macierzy L i U, że A = L*U. Macierz L nie musi być trójkątna ??.
W MATLAB-ie rozkład macierzy A na iloczyn L*U wykonuje funkcja lu (tabela 3.4). Algorytm realizujący powyższą metodę rozwiązywania układu równań liniowych zapisano w M-pliku funkcyjnym leqlu.m. Jego zawartość jest następująca: