Matlab materiały opracowane w oparciu o help MATLABa + ćwiczenia własne str. 1 opracowanie: Mariola Kędra Politechnika Krakowska Podstawową strukturą danych w MATLABie jest tablica (array). Zmienna jest tablicą 1 x 1 czyli skalarem. Tablica może być jednowymiarowa (wektor): wierszowa (1 x n) lub kolumnowa (n x 1) bądź wielowymiarowa: A(wiersz, kolumna, strona, książka, tom) Nazwa (zmiennej, tablicy, funkcji) ciąg alfanumeryczny bez polskich znaków, długość maks. 63 znaki, zaczyna się od litery, mogą wystąpić litery, cyfry i znaki podkreślenia, ale nie może być spacji ; dłuższe nazwy są ucinane do 63 znaków; duże i małe litery są rozróżniane; nazwa i Nazwa to dwie różne nazwy. Typy danych: 1. double liczby podwójnej precyzji (double array); typ podstawowy (defaultowy) dla zmiennych i tablic; zakres wartości ( 2.2257e 38; 1.79769e+38) 2. char znaki i łańcuchy znaków definiowane za pomocą apostrofów np. 'łańcuch'; jest to tablica znakowa (wektor wierszowy) o długości równej ilości znaków w łańcuchu, przy czym na każdy znak przeznaczone są 2 bajty); przechowuje w pamięci liczby całkowite reprezentujące kody ASCII poszczególnych znaków łańcucha 3. sparse dwuwymiarowa macierz rzadka (double array sparse); zapamiętywane są tylko elementy niezerowe danej macierzy np. A = [-1 ; 7.5], S = sparse(a); wtedy S = (1,1) 1 (2,3) 7.5 4. cell tablica złożona z komórek, które mogą zawierać tablice; tworzenie pustej tablicy komórkowej: C = cell(ilość wierszy, ilość kolumn); 5. struct typ strukturalny; tablice strukturalne odwołują się do nazw pól, które mogą zawierać inne tablice 6. userobject typ definiowany przez użytkownika. WSZYSTKIE OBLICZENIA W MATLAB-ie DLA ZMIENNYCH NUMERYCZNYCH I ŁAŃCUCHOWYCH SĄ PROWADZONE W TRYBIE PODWÓJNEJ PRECYZJI (double). Możliwe konwersje typu double na typ: 1. single liczba rzeczywista pojedynczej precyzji; przyjmuje wartości z zakresu (-3.4282e38; 3.4283e+38), przykładowe użycie: xs = single(x) 2. int8 liczba całkowita 8-bitowa ze znakiem; przyjmuje wartości z zakresu (-128; 127) 3. int16 liczba całkowita 16-bitowa ze znakiem; przyjmuje wartości z zakresu (-32768; 32767) 4. int32 liczba całkowita 32-bitowa ze znakiem; przyjmuje wartości z zakresu (-2 147 483 648 to 2 147 483 647) 5. int64 liczba całkowita 64-bitowa ze znakiem; przyjmuje wartości z zakresu (-9 223 372 36 854 775 88; 9 223 372 36 854 775 87) 6. uint8 liczba całkowita 8-bitowa bez znaku; przyjmuje wartości z zakresu (; 255) 7. uint16 liczba całkowita 16-bitowa ze znakiem; przyjmuje wartości z zakresu (; 65535) 8. uint32 liczba całkowita 32-bitowa bez znaku; przyjmuje wartości z zakresu (; 4 294 967 295) 9. uint64 liczba całkowita 64-bitowa bez znaku; przyjmuje wartości z zakresu (; 18 446 744 73 79 551 615) Uwaga! Operacje matematyczne można wykonać w MATLABie tylko dla typu double; ale nie dla powyższych (po konwersji).
str. 2 Operatory arytmetyczne: Opis Operator macierzowy Operator tablicowy (notacja kropkowa) Przykład macierzowy dodawanie + + A+B A+B odejmowanie - - A-B A-B mnożenie *.* A*B A.*B Przykład tablicowy A../B c ij = a ij *b ij dzielenie /./ A/B (prawostronne) = A* B -1 c ij = a ij /b ij potęgowanie ^.^ A^p = A*A*...*A A..^2 A^(-p) = (A -1 )^p = A..*A transponowanie. A A. Operatory relacyjne: Opis Operator Przykład Sprawdzenie, czy większy > x> x jest dodatni mniejszy < x<-5 x jest mniejszy niż -5 większy bądź równy >= x>=4 x jest większy bądź równy 4 mniejszy bądź równy <= a<=b a jest mniejsze bądź równe b równy = = c==d c jest równe d nierówny (różny) ~= x~= x nie jest równe Operatory logiczne: Opis Operator Przykład Sprawdzenie, czy AND (koniunkcja) & (x<a)&(x<b) x<a i x<b OR (alternatywa) (x>5) (x<) x>5 lub x< NOT (negacja) ~ ~(x=) nie jest prawdą, że x = Znaki specjalne: = znak przypisania (np. x = 23.5; a = 23; tekst = jakiś dowolny tekst objęty parą apostrofów ) % rozpoczyna komentarz w linii (obowiązuje do końca linii). kropka dziesiętna (separator części całkowitej i ułamkowej w liczbie rzeczywistej)... kontynuacja polecenia w następnej linii, separator poleceń, argumentów funkcji, indeksów tablicy, elementów tablicy ; kończy wiersz macierzy; blokuje wypisywanie wyniku na ekranie : tworzenie ciągów wartości liczbowych z przedziału [a; b] z krokiem krok a:krok:b ; podawanie zakresu w wyrażeniach indeksowych np.:1:2:1 ciąg liczbowy, pierwszy el. = 1, następne z krokiem 2, aż do1 ' początek lub koniec łańcucha znaków; operator transpozycji; operator sprzężenia zespolonego () nawiasy określające kolejność działań; używane również do podawania argumentów wejściowych funkcji i podawania indeksów tablic; [] tworzenie tablic ( A = [elementy tablicy]), argumenty wyjściowe funkcji ( function [wy 1, wy 2,..., wy n ] = nazwa_funkcji (we1, we 2,, we k )) łączenie tablic w jedną większą (C = [A, B]) {} indeksy struktur (struct) i tablic komórkowych (cell)
str. 3 Funkcje elementarne: sin (x) sind (x) sinh (x) asin(x) asind(x) cos (x) cosd (x) cosh (x) acos(x) acosd(x) tan (x) tand (x) tanh (x) atan(x) atand(x) cot (x) cotd (x) coth (x) acot(x) acotd(x) sinus dla arg. x podanego w radianach sinus dla arg. x podanego w stopniach sinus hiperboliczny dla arg. x podanego w radianach arcus sin, wynik w radianach arcus sin, wynik w stopniach cosinus dla arg. x podanego w radianach cosinus dla arg. x podanego w stopniach cosinus hiperboliczny dla arg. x podanego w radianach arcus cosin, wynik w radianach arcus cosin, wynik w stopniach tangens dla arg. x podanego w radianach tangens dla arg. x podanego w stopniach tangens hiperboliczny dla arg. x podanego w radianach arcus tan, wynik w radianach arcus tan, wynik w stopniach cotangens dla arg. x podanego w radianach cotangens dla arg. x podanego w stopniach cotangens hiperboliczny dla arg. x podanego w radianach arcus cotangens, wynik w radianach arcus cotangens, wynik w stopniach exp(x) abs(x) wartość bezwzględna z x log(x) ln x reallog(x) logarytm naturalny z liczby rzeczywistej; jeśli x<, to błąd log1(x) log 1 x log2(x) log 2 x floor(x) zaokrągla w dół do liczby całkowitej (floor(.88) = ; floor(.5) = ) round(x) zaokrągla do najbliższej liczby całkowitej (round(.88) daje w wyniku 1; round(.5) daje w wyniku 1; round(.45) daje w wyniku ) sqrt(x) pierwiastek kwadratowy sign(x) znak liczby x; 1 jeśli x >, jeśli x =, -1 jeśli x < nthroot(x,n) pierwiastek rzeczywisty n-tego stopnia z liczby rzeczywistej x; e x Zmienne specjalne: pi liczba niewymierna π realmin najmniejsza możliwa w danym systemie op. liczba rzeczywista, np. x = realmin realmax najmniejsza możliwa w danym systemie op. liczba rzeczywista, np. y = realmax nargin liczba argumentów wejściowych funkcji (skrót: number of arguments input) nargout liczba argumentów wyjściowych funkcji (skrót: number of arguments output) Inf reprezentacja arytmetyczna symbolu +, wynik matematycznie niezdefiniowanych operacji takich jak dzielenie przez zero: 1./. albo przy overflow przekroczeniu zakresu na reprezentację liczby np. exp(999) NaN reprezentacja arytmetyczna Not a Number, wynik matematycznie niezdefiniowanych operacji takich jak:./., Inf/Inf
str. 4 Przykładowy wygląd aplikacji MATLAB: W oknie poleceń Command Window (środek aplikacji MATLAB) po znaku zachęty >> wydawane są polecenia (komendy). Klawisze umożliwiające sterowanie linią poleceń: Ctrl+p lub Ctrl+n lub BackSpace Del Esc, Ctrl+u Ctrl+k wybranie poprzedniego polecenia wybranie następnego polecenia kasowanie znaku na lewo od kursora kasowanie znaku na prawo od kursora kasowanie bieżącej linii kasowanie tekstu do końca linii Po prawej stronie widoczne są dwa okna: górne pokazuje zawartość przestrzeni roboczej (Workspace) dolne (Command History) pokazuje historię (listę) użytych poleceń. Po lewej stronie widoczne są dwa okna: górne pokazuje zawartość folderu (katalogu) aktualnie wybranego (Current Folder); dolne pokazuje szczegóły zaznaczonego pliku z folderu roboczego ans zmienna robocza tworzona automatycznie w sytuacji gdy obliczane wyrażenie nie jest nigdzie przypisane, wtedy zostanie ono przypisane tej właśnie zmiennej.
str. 5 Polecenia: help wyświetlenie listy głównych tematów pomocy Help help nazwa wyświetlenie informacji pomocniczej dotyczącej funkcji lub skryptu nazwa dir wyświetlenie zawartości aktualnego katalogu (folderu) who wyświetlenie listy zmiennych istniejących w przestrzeni roboczej MATLABa clear usunięcie (wyczyszczenie) wszystkich zmiennych z przestrzeni roboczej clear nazwa usunięcie (wyczyszczenie) zmiennej nazwa z przestrzeni roboczej save load zapisanie zmiennych z przestrzeni roboczej w pliku w aktualnie wybranym folderze: save Nazwa_pliku plik będzie binarny i jeśli nie ma rozszerzenia (.---) to otrzyma rozszerzenie.mat save Nazwa_pliku... -ASCII plik będzie tekstowy (8-bitowe kody ASCII) niezależnie od rozszerzenia save Nazwa_pliku... -ASCII -Double plik będzie tekstowy (16-bitowe kody ASCII) niezależnie od rozszerzenia save Nazwa_pliku... -MAT plik będzie binarny niezależnie od rozszerzenia save Nazwa_pliku x zapisanie w pliku jedynie zmiennej x save Nazwa_pliku x y z zapisanie w pliku zmiennych x, y, z załadowanie do przestrzeni roboczej zmiennych zapisanych w pliku load Nazwa_pliku jeśli plik nie ma rozszerzenia (.---) to jest traktowany jak binarny (z rozszerzeniem.mat); jeśli ma rozszerzenie inne niż.mat to jest traktowany jak tekstowy (ASCII) load Nazwa_pliku x załadowanie z pliku Nazwa_pliku jedynie zmiennej x (dla pliku binarnego) load Nazwa_pliku x y z załadowanie z pliku Nazwa_pliku zmiennych x, y, z (dla pliku binarnego) load Nazwa_pliku x załadowanie z pliku Nazwa_pliku danych do tablicy identycznej jak Nazwa_pliku bez uwzględniania rozszerzenia (dla pliku tekstowego) Format wyprowadzenie (wypisanie) wartości liczbowych w konkretnej postaci; formatem domyślnym jest format short, który wyprowadza (wypisuje) tylko 4 cyfry po kropce dziesiętnej (w reprezentacji stałoprzecinkowej). Dostępne formaty: format short format long format short e format long e format rat format 4 cyfry po kropce dziesiętnej w reprezentacji stałoprzecinkowej 14-15 cyfr po kropce dziesiętnej w reprezentacji stałoprzecinkowej dla typu double; 7 cyfr po kropce dziesiętnej dla typu single 4 cyfry po kropce dziesiętnej w reprezentacji zmiennoprzecinkowej 14-15 cyfr po kropce dziesiętnej w reprezentacji zmiennoprzecinkowej dla typu double; 7 cyfr po kropce dziesiętnej dla typu single liczba w postaci ułamka format domyślny (to samo co format short)
str. 6 Wektory, tablice i macierze Tworzenie poprzez wyliczenie elementów: x = [1 1.3 2-4.1.9 ] powstanie wektor wierszowy o 6 elementach równych kolejno 1, 1.3, 2, -4.1,.9, ; elementy w wierszu rozdziela się spacją lub przecinkiem; y = [1 1.3 2-4.1.9 ]' poprzez transpozycję wektora wierszowego powstanie wektor jednokolumnowy y = 1. 1.3 2. -4.1.9. z = [1; 1.3; 2; -4.1;.9; ] powstanie wektor jednokolumnowy, poszczególne wiersze rozdziela się średnikiem; z = 1. 1.3 2. -4.1.9. A = [1 1.3 2; -4.1.9 ] powstanie macierz A mająca dwa wiersze (bo jest tylko jeden średnik służący do rozdzielania wierszy) i trzy kolumny; elementy w wierszu rozdziela się spacją lub przecinkiem A = 1. 1.3 2. -4.1.9. Tworzenie z wykorzystaniem symbolu dwukropka: A = [2:2:1; -1:1:3; -3:4:13] powstanie macierz A mająca trzy wiersze (występują dwa średniki) i pięć kolumn; A = 2 4 6 8 1-1 1 2 3-3 1 5 9 13 Tworzenie z wykorzystaniem funkcji (funkcje jedno lub dwuargumentowe):
str. 7 eye(n) generuje macierz jednostkową n x n (z jedynkami na przekątnej głównej, pozostałe elementy są zerowe) eye(n,m) generuje tablicę jednostkową n x m (z jedynkami na przekątnej głównej, pozostałe elementy są zerowe) ones(n) generuje tablicę n x n złożona z samych jedynek ones(n,m) generuje tablicę n x m złożona z samych jedynek zeros(n) generuje tablicę n x n złożoną z samych zer zeros(n,m) generuje tablicę n x m złożoną z samych zer rand(n) generuje tablicę n x n o elementach będących liczbami losowymi o rozkładzie równomiernym z przedziału (,1) rand(n,m) generuje tablicę n x m o elementach będących liczbami losowymi o rozkładzie równomiernym z przedziału (,1) randn(n) generuje tablicę n x n złożoną z liczb będących liczbami losowymi o rozkładzie normalnym randn(n,m) generuje tablicę n x m złożoną z liczb będących liczbami losowymi o rozkładzie normalnym Funkcje do działań na macierzach: det(a) daje wartość wyznacznika macierzy kwadratowej A inv(a) daje macierz odwrotną do macierzy A A' transpozycja macierzy A sum(a) dla wektorów oblicza sumę wszystkich elementów; dla macierzy daje wektor wierszowy, którego elementami są sumy elementów z poszczególnych kolumn macierzy prod(a) dla wektorów oblicza iloczyn wszystkich elementów; dla macierzy daje wektor wierszowy, którego elementami są iloczyny elementów z poszczególnych kolumn macierzy mean(a) dla wektorów daje średnią arytmetyczną z jego elementów; dla macierzy daje wektor wierszowy, którego elementami są wartości średnich arytmetyczną z poszczególnych kolumn macierzy max(a) dla wektorów daje wartość elementu największego; dla macierzy daje wektor wierszowy, którego elementami są wartości elementów maksymalnych z poszczególnych kolumn macierzy min(a) dla wektorów daje wartość elementu najmniejszego; dla macierzy daje wektor wierszowy, którego elementami są wartości elementów minimalnych z poszczególnych kolumn macierzy sort(a) lub sort(a, ascend ) dla wektorów daje wektor uporządkowany rosnąco; dla macierzy sortuje każdą kolumnę A rosnąco sort(a, descend ) dla wektorów daje wektor uporządkowany malejąco; dla macierzy sortuje każdą kolumnę A malejąco tril(a) daje macierz trójkątną dolną z macierzy A triu(a) daje macierz trójkątną górną z macierzy A diag(a) daje wektor kolumnowy z przekątnej głównej macierzy A
str. 8 Tworzenie skryptów plików z rozszerzeniem.m Menu: File -> New -> M-File Skrypty to pliki tworzone w celu zapisania ciągów poleceń czy instrukcji do wykonania, z których następnie wielokrotnie się korzysta. Skrypt należy zapisać pod wybraną nazwą (ciąg alfanumeryczny czyli litery (bez polskich znaków) i cyfry oraz znak podkreślenia; w nazwie nie może być spacji ) i rozszerzeniem.m (File -> Save as ). Wykonanie skryptu: z poziomu skryptu (aktywny skrypt) wybieramy Debug -> Run albo klawisz funkcyjny F5 z okna Command Window podajemy nazwę skryptu: >> nazwa_skryptu Enter z okna Current Directory zaznaczamy nazwę skryptu i pod prawym klawiszem myszki wybieramy Run. Skrypt można wykorzystać do utworzenia własnej funkcji; wtedy nazwa skryptu musi pokrywać się z nazwą funkcji (i wiadomo rozszerzenie.m). Utworzenie własnej funkcji (z użyciem słowa kluczowego function): function [wy 1, wy 2,..., wy n ] = nazwa_funkcji (we 1, we 2,, we m ) % funkcja nazwa_funkcji oblicza... % % Argumenty wejściowe: % we 1 objaśnienie dla arg. 1 % we 2 objaśnienie dla arg. 2 %... % we m objaśnienie dla arg. m %---------------------------------- % Argumenty wyjściowe: % wy 1 objaśnienie dla arg. 1 % wy 2 objaśnienie dla arg. 2 %... % wy n objaśnienie dla arg. n %----------------------------------- instrukcja 1 ; instrukcja 2 ;... instrukcja k ; % koniec funkcji wraz z końcem pliku, ale można zakończyć słowem: end % Uwaga! Należy pamiętać, że w ciągu instrukcji wykorzystujemy argumenty wejściowe % do obliczenia pośrednio lub bezpośrednio argumentów wyjściowych. % Stąd w "ciele funkcji" powinno nastąpić przypisanie wyniku argumentom wynikowym.
str. 9 Wybrane instrukcje programistyczne instrukcja warunkowa if ('jakby' trzy rodzaje, a tak naprawdę części else i elseif są opcjonalne) if wyrażenie % jeśli wyrażenie ma wartość logiczną 1 (prawdy), to wykonywany jest instrukcja1, % podany ciąg instrukcji instrukcja2,... instrukcja n end %kończy instrukcję (tu instrukcję if) --------------------------------------------------------------------- if wyrażenie % jeśli wyrażenie ma wartość logiczną 1 (prawda), to wykonywany jest instrukcja1, % podany ciąg instrukcji instrukcja2,... instrukcja n else % w przeciwnym razie czyli w przypadku gdy wyrażenie ma wartość % logiczną (fałsz), wykonywany jest podany instrukcja1, % ciąg instrukcji instrukcja2,... instrukcja k end %kończy instrukcję (tu instrukcję if) -------------------------------------------------------------------- if wyrażenie1 instrukcja1, instrukcja2,... instrukcja n % jeśli wyrażenie1 ma wartość logiczną 1 (prawda), wykonywany jest % podany ciąg instrukcji elseif wyrażenie2 % jeśli wyrażenie2 ma wartość logiczną 1 (prawda), wykonywany jest instrukcja1, % podany ciąg instrukcji instrukcja2,... instrukcja k elseif wyrażenie3 % jeśli wyrażenie3 ma wartość logiczną 1 (prawda), wykonywany jest instrukcja1, % podany ciąg instrukcji instrukcja2,... instrukcja m.. % ewentualnie kolejne elseif. else instrukcja1, % w przeciwnym razie czyli w przypadku gdy wszystkie poprzednie % wyrażenia mają wartość logiczną (fałsz), wykonywany jest podany % ciąg instrukcji
str. 1 instrukcja2,... instrukcja k end %kończy instrukcję (tu instrukcję if) instrukcje iteracyjne: pętla for, pętla while - pętla for to powtórzenie ciągu instrukcji określoną (sprecyzowaną) liczbę razy; liczba ta jest równa liczbie przypisań nowej wartości dla zmiennej zmienna1; for zmienna1 = wyrażenie %np. w postaci a:krok:b instrukcja1, % ciąg instrukcji instrukcja2,... instrukcja n end %kończy instrukcję (tu instrukcję for) - pętla while to wykonanie ciągu instrukcji z góry niesprecyzowaną ilość razy; aby nastąpiło wykonanie (lub ponowne wykonanie) ciągu instrukcji - wyrażenie musi mieć wartość logiczną 1 (prawda); jeśli wyrażenie ma wartość logiczną (fałsz) to pętla kończy działanie bez (dalszego kolejnego) wykonania ciągu instrukcji; while wyrażenie instrukcja1, % ciąg instrukcji instrukcja2,... instrukcja n end %kończy instrukcję (tu instrukcję while) instrukcje wejścia (wprowadzanie danych) wprowadzenie (podanie) przez użytkownika wartości liczbowej zmiennej zmienna1, "dla ułatwienia " użytkownik może mieć podpowiedź (tekst w apostrofach) dotyczącą podawanej zmiennej: zmienna1 = input ('informacja dotycząca zmiennej') np. predkosc = input (' Podaj średnią prędkość ruchu ') W ogólnym przypadku użytkownik może podać jakiekolwiek wyrażenie (poprawnie zapisane w MATLABie), które zostanie najpierw policzone, a jego wynik przypisany następnie zmiennej zmienna1. Zamiast wartości liczbowej zmiennej można wprowadzić (podać) tekst (dowolny ciąg znaków); wtedy piszemy: nazwisko = input(' Jak się nazywasz? ', 's') instrukcje wyjścia (wypisywanie danych, wyników i innych informacji)
str. 11 - Wypisanie zawartości tablicy A, nazwa tablicy nie jest podawana; gdy A jest łańcuchem znaków (tekstem), wtedy jest on wypisany: disp (A) disp ('dowolny tekst') - formatowany zapis danych do pliku instrukcja fprintf count = fprintf (fid, format, zmienna1, zmienna2,...) Instrukcja powoduje wypisanie (zgodnie z formatem format) wartości kolejnych zmiennych zmienna1, zmienna2,... do pliku skojarzonego ze zmienną fid (ang. file indentifier identyfikator pliku). Licznik count (opcjonalny) zawiera liczbę bajtów poprawnie zapisanych. Fid jest liczbą całkowitą i oznacza numer strumienia wynikowego (jeśli fid nie wystąpi po nawiasie funkcji fprintf przyjmuje się, że jest równy 1); fid = 1 oznacza standardowy plik wyjściowy czyli ekran; fid = 2 oznacza standardowy plik dla błędów; zasadniczo fid dla pliku wynikowego otrzymuje się z instrukcji fopen (i są to kolejne liczby całkowite od 3 w górę). Format jest łańcuchem znaków podającym sposób wydruku danych na plik. Postać wydruku danej rozpoczyna się znakiem % a kończy jednym z wymienionych znaków konwersji typu danych: d, i, o, u, x, X, f, e, E, g, G, c oraz s. Pomiędzy nimi podana jest ilość znaków do wypisania z całej liczby (wliczając w to kropkę), a po kropce ilość znaków części dziesiętnej wypisywanej danej liczbowej. Typy konwersji: d dla liczby całkowitej, f, e, E dla liczby rzeczywistej, s dla łańcucha znakowego. Przykładowo wypisanie kolejno zmiennej x = 3, a następnie y = 12.77777 na ekran instrukcją: fprintf (1, ' zmienna x = %6.2f zmienna y = %12.8f ', x, y) lub opuszczając numer strumienia fprintf (' zmienna x = %6.2f zmienna y = %12.8f ', x, y) da efekt: zmienna x = 3. zmienna y = 12.77777 Przy zapisie wyników do pliku, przed wykonaniem instrukcji fprintf należy pamiętać o wykonaniu instrukcji fopen: fid = fopen( nazwa_pliku, w ) % fid = 1 oznacza błąd związany z otwarciem pliku % w oznacza otwarcie pliku w trybie do zapisu (z ang. write) % bez podania trybu otwarcia pliku domyślnie przyjęty jest tryb r czyli do % odczytu (z ang. read) a po instrukcji fprintf zamknąć dostęp do pliku skojarzonego ze zmienną fid: st = fclose(fid) % st jest zmienną opcjonalną; st = 1 oznacza błąd % zamknięcia pliku; st = (poprawne zamknięcie)
str. 12 tworzenie wykresów Przykład wydruku do pliku tekstowego exp.txt tablicy z wartościami funkcji wykładniczej e x : x = :.1:2; % utworzenie wektora x, którego elementami są kolejne % liczby rzeczywiste z przedziału [; 2] z krokiem.1 y = [x; exp(x)]; % utworzenie tablicy dwuwymiarowej y złożonej z % dwóch kolumn: wektora x oraz wartości funkcji exp % dla poszczególnych elementów wektora x fid = fopen ('exp.txt', 'w'); fprintf (fid,' %6.2f %12.8f\n ',y); fclose(fid); Wynikiem jest utworzenie pliku tekstowego o nazwie exp.txt i zawartości:. 1..1 1.151792... 1. 2.71828183... 2. 7.389561 Uwaga: \n oznacza przejście do następnej linii wydruku. narysowanie pojedynczego okienka z wykresem instrukcja plot; np. gdy argumenty funkcji y(x) = sin(2x 3 ) +1 tworzą wektor x, a jej wartości wektor y piszemy: plot(x,y) zatrzymanie wykresu w celu wykonania na nim dalszych operacji instr. hold on hold on dodanie legendy instrukcja legend opisująca krzywą na rysunku; np. legend('y(x)') dodanie podpisu osi X instrukcja xlabel; np. xlabel('x') dodanie podpisu osi Y instrukcja ylabel; np. ylabel('y(x)') dodanie tytułu wykresu instrukcja title; np. title('wykres funkcji y(x) = sin(2x^3)+1') połączenie kilku okienek z wykresami w jeden rysunek (jedną całość) wraz z ułożeniem ich dwuwymiarowo (tablicowo) instrukcja subplot: subplot (ilość_el._w_pionie, ilość_el._w_poziomie, nr_elementu) np. chcemy mieć 2 okienka w pionie i 3 w poziomie,
str. 13 % rysujemy w pierwszym okienku licząc od lewego górnego rogu: subplot(2, 3, 1) plot(x1, y1) % rysujemy w szóstym okienku licząc od lewego górnego rogu: subplot(2, 3, 6) plot(x6, y6) % rysujemy w czwartym okienku licząc od lewego górnego rogu: subplot(2, 3, 4) plot(x4, y4) instrukcja ( wykonywalna albo wartościująca ) eval pozwala obliczyć wartość wyrażenia podanego jako argument tekstowy (łańcuch znaków); np. jeśli wzor = '4*x^3-12*x^2+4*x' to wynik = eval(wzor) spowoduje obliczenie wyrażenia podanego wzorem dla aktualnej wartości zmiennej x i przypisanie wyniku zmiennej wynik instrukcja error służy do przerwania wykonania działania instrukcji w przypadku wystąpienia błędu, a przy okazji istnieje możliwość wypisania stosownego komunikatu; np. error( Wystąpił błąd ) ZADANIA (wraz z rozwiązaniami ) 1. Jak działa instrukcja podstawienia (przypisania): znak '='? Przykładowo: w1 = w2 Najpierw obliczana jest prawa strona instrukcji podstawienia czyli wartość wyrażenia w2, a następnie ta wartość zostaje przypisana lewej stronie czyli w1. Oznacza to, że zapis: w1 = w1+1 jest poprawny, bo najpierw obliczana jest prawa strona czyli w1+1, a następnie ta wartość zostaje przypisana lewej stronie czyli w1. 2. Jak stworzyć zmienną o określonej wartości liczbowej (np. zmienną rok o wartości całkowitej 29)? Instrukcją podstawienia, pisząc: nazwa_zmiennej = wartosc_liczbowa np. rok = 29 3. Jak stworzyć zmienną o określonej wartości liczbowej (np. zmienną temperatura o wartości rzeczywistej 3,5 [ºC])? Pamiętamy, że w MATLAB-ie liczby rzeczywiste wpisujemy z kropką dziesiętną (zamiast przecinka). temperatura = -3.5 temperatura1 =.5 temperatura2 = 4.
str. 14 4. Jak zmienić wartość już istniejącej zmiennej (np. zmiennej temperatura1 na wartość 2,5 [ºC])? Tak jakby zmienna nie istniała, czyli instrukcją podstawienia: temperatura1 = 2.5 5. Jak wczytać zmienną, której wartość liczbowa nie jest z góry znana i to użytkownik decyduje, jaka ona będzie? Np. użytkownik podaje wartość pewnego parametru spadek? (Chodzi raczej o spadek terenu, niż spadek po ciotce z Ameryki. ) spadek = input('podaj spadek terenu: \nspadek = ') 6. Jak wypisać aktualną wartość zmiennej (bez formatowania wydruku)? Najprościej poprzez użycie jej nazwy, np. temperatura temperatura = -3.5 bądź przez instrukcję disp: disp(temperatura) -3.5 7. Jak wypisać aktualną wartość zmiennej w określonej postaci (formatując w odpowiedni sposób wydruk)? Np. wartość zmiennej temperatura na 13 polach (w tym wliczona jest kropka dziesiętna) i 6 cyfr po kropce wraz z przejściem do nowej linii wydruku (znak \n) stosujemy instrukcję fprintf: fprintf ('%13.6f\n', temperatura) -3.5 Np. wartość zmiennej temperatura na 15 polach (w tym wliczona jest kropka dziesiętna) i 7 cyfr po kropce wraz z przejściem do nowej linii wydruku (znak \n), poprzedzając tę wartość dowolnym objaśnieniem stosujemy instrukcję fprintf: fprintf ('Aktualna wartość zmiennej temperatura wynosi %15.7f [st.c]\n', temperatura) Aktualna wartość zmiennej temperatura wynosi -3.5 [st.c] 8. Jak wypisać aktualną wartości kilku zmiennych w określonej postaci (formatując w odpowiedni sposób wydruk)? Np. w jednej linii wartości trzech zmiennych: temperatura na 12 polach i 5 cyfr po kropce, temperatura1 na 11 polach i 2 cyfry po kropce, temperatura2 na 11 polach i 3 cyfr po kropce wraz z odpowiednimi objaśnieniami stosujemy instrukcję fprintf: fprintf('temperatura = %12.5f temperatura1 = %11.2f temperatura2 = %11.3f \n', temperatura, temperatura1, temperatura2)
str. 15 temperatura = -3.5 temperatura1 = 2.5 temperatura2 = 4. Np. w pierwszej linii wartość zmiennej: temperatura na 12 polach i 5 cyfr po kropce, w drugiej linii wartości dwóch pozostałych zmiennych: temperatura1 na 11 polach i 2 cyfry po kropce, temperatura2 na 11 polach i 3 cyfr po kropce wraz z odpowiednimi objaśnieniami stosujemy instrukcję fprintf wstawiając znak \n po pierwszej specyfikacji formatu wydruku: fprintf('temperatura = %12.5f\ntemperatura1 = %11.2f temperatura2 = %11.3f \n', temperatura, temperatura1, temperatura2) temperatura = -3.5 temperatura1 = 2.5 temperatura2 = 4. 9. Jak stworzyć zmienną łańcuchową określony łańcuch znaków (np. zmienną NRok będącą łańcuchem znaków Nowy Rok)? Instrukcją podstawienia, pisząc: NRok = 'Nowy Rok' 1. Jak zmienić wartość już istniejącej zmiennej łańcuchowej (np. zmiennej NRok na rok 29 )? Tak jakby zmienna nie istniała, czyli instrukcją podstawienia: NRok = 'rok 29' W przypadku zmiany w zmiennej łańcuchowej jedynie pewnego podciągu znaków na inny wskazujemy miejsce zmiany np. pierwszy znak ma być zastąpiony znakiem R : NRok(1) = 'R' NRok = Rok 29 11. Jak wczytać zmienną łańcuchową, której wartość nie jest z góry znana i to użytkownik decyduje, jaka ona będzie? Np. użytkownik podaje nazwę pliku z danymi, z którego należy wczytać dane? dane = input('podaj nazwę pliku z danymi: \ndane = ','s') 12. Jak wypisać aktualną wartość zmiennej łańcuchowej (bez formatowania wydruku)? Najprościej poprzez użycie jej nazwy, np. NRok NRok = Rok 29 bądź przez instrukcję disp:
str. 16 disp(nrok) Rok 29 13. Jak stworzyć wektor wierszowy mający n elementów (można go potraktować również jako macierz rozmiaru 1 na n) o określonych wartościach (np. 7-elementowy wektor xwektor o wartościach 2-1 1 7 6 5 )? Instrukcją podstawienia, pisząc: xwektor = [2-1 1 7 6] xwektor = 2-1 1 7 6 5 14. Jak stworzyć wektor wierszowy mający n elementów (można go potraktować również jako macierz rozmiaru 1 na n) o określonych wartościach będących ciągiem liczb z pewnego zakresu wartości o stałym kroku (np. wektor awektor o wartościach z zakresu -5 do -1 i kroku.5)? Instrukcją podstawienia, pisząc: awektor = [-5:.5:-1] awektor = -5. -4.5-4. -3.5-3. -2.5-2. -1.5-1. 15. Jak zmienić wartość jednego elementu w już istniejącym wektorze wierszowym? (np. w wektorze xwektor wartość trzeciego elementu na 1)? Na dwa sposoby. Pierwszy sposób: instrukcją podstawienia wskazując miejsce zmiany w wektorze (i traktując go jednowymiarowo ): xwektor (3) = 1 Drugi sposób: instrukcją podstawienia wskazując miejsce zmiany, przy czym wektor wierszowy traktujemy dwuwymiarowo jako macierz rozmiaru 1 na n : xwektor (1, 3) = 1 w odpowiedzi na oba sposoby uzyskamy informację w postaci: xwektor = 2 1 1 7 6 5 16. Jak w wektorze wierszowym nadać tę samą wartość kilku elementom równocześnie? (np. w wektorze xwektor wartość trzeciego, czwartego i piątego elementu ustawić na 32)? Na dwa sposoby. Pierwszy sposób: instrukcją podstawienia wskazując miejsce (w postaci zakresu indeksów 3:5) w wektorze (i traktując go jednowymiarowo): xwektor (3:5) = 32
str. 17 Drugi sposób: instrukcją podstawienia wskazując miejsce (w postaci zakresu indeksów 3:5), przy czym wektor wierszowy traktujemy dwuwymiarowo jako macierz rozmiaru 1 na n : xwektor (1, 3:5) = 32 w odpowiedzi na oba sposoby uzyskamy informację w postaci: xwektor = 2 32 32 32 6 5 17. Jak wypisać elementy wektora wierszowego (bez formatowania wydruku)? Najprościej poprzez użycie jego nazwy, np. xwektor xwektor = 2 32 32 32 6 5 bądź przez instrukcję disp: disp(xwektor) 2 32 32 32 6 5 18. Jak stworzyć wektor kolumnowy mający k elementów (można go potraktować również jako macierz rozmiaru k na 1) o określonych wartościach (np. 8-elementowy wektor ywektor o wartościach 12 2-1 1 7-5 9)? Na dwa sposoby: Pierwszy sposób: instrukcją podstawienia (średniki rozdzielają wiersze), pisząc: ywektor = [12; 2; -1; 1; 7; ; -5; 9] Drugi sposób: instrukcją podstawienia (bez średników, ale za to z użyciem operatora transpozycji '), pisząc: ywektor = [12 2-1 1 7-5 9] ' w odpowiedzi na oba sposoby uzyskamy informację w postaci: ywektor = 12 2-1 1 7-5 9 19. Jak stworzyć wektor kolumnowy mający k elementów (można go potraktować również jako macierz rozmiaru k na 1) o określonych wartościach będących ciągiem liczb z pewnego zakresu wartości o stałym kroku (np. wektor bwektor o wartościach z zakresu 5 do 1 i kroku -.5)? Instrukcją podstawienia, pisząc: bwektor = [5:-.5:1] '
str. 18 bwektor = 5. 4.5 4. 3.5 3. 2.5 2. 1.5 1. 2. Jak zmienić wartość jednego elementu w już istniejącym wektorze kolumnowym? (np. w wektorze ywektor wartość drugiego elementu na 4)? Na dwa sposoby. Pierwszy sposób: instrukcją podstawienia wskazując miejsce zmiany w wektorze (i traktując go jednowymiarowo ): ywektor (2) = 4 Drugi sposób: instrukcją podstawienia wskazując miejsce zmiany, przy czym wektor kolumnowy traktujemy dwuwymiarowo jako macierz rozmiaru k na 1: ywektor (2, 1) = 4 w odpowiedzi na oba sposoby uzyskamy informację w postaci: ywektor = 12 4-1 1 7-5 9 21. Jak w wektorze kolumnowym nadać tę samą wartość kilku elementom równocześnie? (np. w wektorze ywektor wartość czwartego, piątego, szóstego i siódmego elementu ustawić na )? Na dwa sposoby. Pierwszy sposób: instrukcją podstawienia wskazując miejsce (w postaci zakresu indeksów 4:7) w wektorze (i traktując go jednowymiarowo): ywektor (4:7) = Drugi sposób: instrukcją podstawienia wskazując miejsce (w postaci zakresu indeksów 4:7), przy czym wektor wierszowy traktujemy dwuwymiarowo jako macierz rozmiaru k na 1: ywektor (4:7,1) = w odpowiedzi na oba sposoby uzyskamy informację w postaci: ywektor = 12 4-1
str. 19 9 22. Jak wypisać elementy wektora kolumnowego (bez formatowania wydruku)? Najprościej poprzez użycie jego nazwy, np. ywektor ywektor = 12 4-1 9 bądź przez instrukcję disp: disp(ywektor) 12 4-1 9 23. Jak stworzyć macierz rozmiaru k na n elementów o podanych wartościach? Np. macierz Amacierz rozmiaru 5 na 4 o wartościach w kolejnych wierszach: 1 2 1 2 1 2-1 -5-9 85 45 4-7 -5 2 11 3-2 8 Instrukcją podstawienia, pisząc: Amacierz = [1 2 1 2; 1 2-1 -5; -9 85 45 4; -7-5 2; 11 3-2 8] Amacierz = 1 2 1 2 1 2-1 -5-9 85 45 4
str. 2-7 -5 2 11 3-2 8 24. Jak zmienić wartość jednego elementu w już istniejącej macierzy? (np. w macierzy Amacierz wartość czwartego elementu w trzecim wierszu na 8)? Instrukcją podstawienia wskazując miejsce zmiany w macierzy: Amacierz (3,4) = 8 Amacierz = 1 2 1 2 1 2-1 -5-9 85 45 8-7 -5 2 11 3-2 8 25. Jak w macierzy nadać tę samą wartość kilku elementom równocześnie? (np. w macierzy Amacierz wszystkim elementom w wierszu piątym wartość równą -3)? Na dwa sposoby. Pierwszy sposób: instrukcją podstawienia wskazując miejsce zmiany: wiersz 5, kolumna w postaci zakresu indeksów 1:4 Amacierz (5,1:4) = -3 Drugi sposób: instrukcją podstawienia wskazując miejsce zmiany: wiersz 5, kolumna w postaci samego znaku : oznaczającego wszystkie możliwe kolumny Amacierz (5, :) = -3 w odpowiedzi na oba sposoby uzyskamy informację w postaci: Amacierz = 1 2 1 2 1 2-1 -5-9 85 45 8-7 -5 2-3 -3-3 -3 26. Jak w macierzy kilku elementom równocześnie nadać wartości będące ciągiem liczbowym o stałym kroku? (np. w macierzy Amacierz wartości w kolumnie 2 mają być ciągiem liczb od -3 do 5 z krokiem 2)? Na dwa sposoby. Pierwszy sposób: instrukcją podstawienia wskazując miejsce zmiany: kolumna 2, wiersze w postaci zakresu indeksów 1:5 Amacierz (1:5,2) = -3:2:5 Drugi sposób: instrukcją podstawienia wskazując miejsce zmiany: kolumna 2, wiersze w postaci samego znaku : oznaczającego wszystkie możliwe wiersze Amacierz (:,2) = -3:2:5 w odpowiedzi na oba sposoby uzyskamy informację w postaci: Amacierz = 1-3 1 2 1-1 -1-5 -9 1 45 8
str. 21 3-5 2-3 5-3 -3 27. Jak wypisać wszystkie elementy macierzy (bez formatowania wydruku)? Najprościej poprzez użycie jej nazwy, np. Amacierz Amacierz = 1-3 1 2 1-1 -1-5 -9 1 45 8 3-5 2-3 5-3 -3 bądź przez instrukcję disp: disp(amacierz) 1-3 1 2 1-1 -1-5 -9 1 45 8 3-5 2-3 5-3 -3 28. Jak stworzyć macierz jednostkową rozmiaru n? (Np. macierz Jednostka rozmiaru 6). Stosując funkcję eye: Jednostka = eye(6) Jednostka = 1 1 1 1 1 1 29. Jak stworzyć macierz wypełnioną samymi zerami rozmiaru n na m? (Np. macierz Zera rozmiaru 3 na 4). Stosując funkcję zeros: Zera = zeros(3,4) Zera =
str. 22 3. Jak stworzyć macierz wypełnioną samymi jedynkami rozmiaru n na m? (Np. macierz jedynki rozmiaru 5 na 2). Stosując funkcję ones: jedynki = ones(5, 2) jedynki = 1 1 1 1 1 1 1 1 1 1 31. Jak obliczyć wyznacznik z macierzy kwadratowej? (Np. z macierzy maca zapamiętując wynik w zmiennej wyzna). Stosując funkcję det: wyzna = det(maca) 32. Jak uzyskać macierz transponowaną do danej macierzy? (Np. MacTransA ma być macierzą transponowaną do maca). Stosując operator transpozycji: MacTransA = maca' 33. Jak obliczyć macierz odwrotną do macierzy kwadratowej? (Np. MacOdwA ma być macierza odwrotną do macierzy maca). Na dwa sposoby. Pierwszy sposób: stosując funkcję inv MacOdwA = inv(maca) Drugi sposób: stosując operator potęgowania: MacOdwA = maca^(-1) 34. Jak obliczyć iloczyn dwóch macierzy? (Np. macierzy A i B, gdy A(n,m) i B(m,k) otrzymując w wyniku macierz C). Pisząc wprost : C = A*B 35. Jak obliczyć sumę dwóch macierzy? (Np. macierzy A i B, gdy A(n,m) i B(n,m) otrzymując w wyniku macierz C). Pisząc wprost : C = A+B 36. Jak podnieść każdy element wektora/ciągu do potęgi p? (Np. wektora x do potęgi 3, otrzymując w wyniku wektor x3). Stosując operator tablicowy.^ x3 = x.^3 37. Jak podnieść każdy element tablicy do potęgi p? (Np. tablicy A do potęgi 3, otrzymując w wyniku tablicę A3). Stosując operator tablicowy.^ A3 = A.^3
str. 23 38. Jak zsumować wszystkie elementy wektora/ciągu? (Np. wektora x, otrzymując w wyniku wektor xsuma). Stosując funkcję sum xsuma = sum(x) 39. Jak zsumować wszystkie elementy tablicy/macierzy? (Np. tablicy A, otrzymując w wyniku tablicę Asuma). Stosując funkcję sum dwukrotnie: Asuma = sum(sum(a)) 4. Jak pomnożyć wszystkie elementy wektora/ciągu? (Np. wektora x, otrzymując w wyniku wektor xiloczyn). Stosując funkcję prod xiloczyn = prod(x) 41. Jak pomnożyć wszystkie elementy tablicy/macierzy? (Np. tablicy A, otrzymując w wyniku tablicę Ailoczyn). Stosując funkcję prod dwukrotnie: Ailoczyn = prod(prod(a)) 42. Jak znaleźć element najmniejszy w wektorze/ciągu? (Np. w wektorze x, otrzymując w wyniku zmienną xmin). Stosując funkcję min xmin = min(x) 43. Jak znaleźć element najmniejszy w tablicy/macierzy? (Np. w tablicy A, otrzymując w wyniku zmienną Amin). Stosując funkcję min dwukrotnie: Amin = min(min(a)) 44. Jak znaleźć element największy w wektorze/ciągu? (Np. w wektorze x, otrzymując w wyniku zmienną xmax). Stosując funkcję max xmax = max(x) 45. Jak znaleźć element najmniejszy w tablicy/macierzy? (Np. w tablicy A, otrzymując w wyniku zmienną Amax). Stosując funkcję max dwukrotnie: Amax = max(max(a)) 46. Jak obliczyć średnią arytmetyczną z wszystkich elementów wektora/ciągu? (Np. wektora x, otrzymując w wyniku zmienną xsrednia). Stosując funkcję mean xsrednia = mean(x) 47. Jak obliczyć średnią arytmetyczną z wszystkich elementów tablicy/macierzy? (Np. tablicy A, otrzymując w wyniku zmienną Asrednia). Stosując funkcję mean dwukrotnie: Asrednia = mean(mean(a))
str. 24 48. Jak obliczyć ilość elementów wektora/długość ciągu? (Np. wektora x, otrzymując w wyniku zmienną xdl). Stosując funkcję length xdl = length(x) 49. Jak obliczyć rozmiar tablicy/macierzy? (Np. tablicy A, otrzymując w wyniku dwie zmienne n i m zawierające liczbę wierszy n i liczbę kolumn m). Stosując funkcję size: [n, m] = size(a) 5. Jak zmienić format wypisywania wartości liczbowych rzeczywistych z short (domyślny: 4 cyfry po kropce dziesiętnej) na long (14 cyfr po kropce dziesiętnej). Komendą format, pisząc: format long i od tej chwili wszystkie wartości liczbowe rzeczywiste będą wypisywane z dokładnością do 14 cyfr po kropce. Powrót do formatu short nastąpi po wydaniu komendy: format albo format short