Ćw.8 -Matlab 2
Transkrypt
Ćw.8 -Matlab 2
Ćwiczenie 8. Matlab – tablice (macierze) Tworzenie tablic i operacje tablicowe Tablica jest programową reprezentacją macierzy. Może być jednowymiarowa (wektor) lub dwuwymiarowa, posiada rozmiar w każdym wymiarze. M=[1 2 3 ] %przypisanie wartości elementom macierzy 1-wymiarowej (wektor wierszowy) M0= [1; 2; 1; 1; 0] % przypisanie macierzy (wektor kolumnowy) M1 = [1 2 3 ; -2 1 1; 1 0 0] %macierz kwadratowa 3x3 M2 = [-4 2 3 ; -1 2 1; 1 0 -2] %inna macierz kwadratowa 3x3 M4 = M1 + M2 % dodanie macierzy (uwaga na wymiary i rozmiar) M5 = M1*M4 % mnożenie macierzy (macierzowo- uwaga na wymiary i rozmiar) M5 = M1.*M % mnożenie macierzy (elementowo - uwaga na wymiary i rozmiar) M6 = M1^2 % podnoszenie macierzy do potęgi (M1*M1 czyli M1 musi być kwadratowa) M7 = M1.^2 % podniesienie do potęgi każdego elementu macierzy (macierz dowolna) M5t = M5' % macierz transponowana M5o = M5^-1 % macierz odwrotna (tylko dla macierzy kwadratowej!) M5o2=inv(M5) % też macierz odwrotna Mj=M5*M5o % sprawdzenie - macierz jednostkowa det(M1) % funkcja obliczenia wyznacznika macierzy kwadratowej disp(M3(3)) % dostęp do elementu macierzy 1-wymiarowej (indeks) disp(M1(2,3)) % dostęp do elementu macierzy 2- wymiarowej (indeksy wiersz-kolumna) Uwaga: po znaku % piszemy komentarze ignorowane przez Matlaba. Inny sposób definicji tablic: M1=0:10:90 Uwaga: wartość_początkowa:krok:wartość_końcowa. M2=0:20 Pominięty krok - ma wartość domyślną 1. Użyteczne funkcje tablicowe rand(n) - losowo generowana tablica kwadratowa nxn rand(n,m) - losowo generowana tablica kwadratowa nxm sum (A) - wektor sum elementów w kolumnach macierzy A sum(sum(A)) - suma wszystkich elementów macierzy dwuwymiarowej sort (B) - sortowanie rosnące tablicy jednowymiarowej max(A) - wektor elementów maksymalnych w kolumnach macierzy A max(max(A)) - element największy w macierzy dwuwymiarowej min(A) - wektor elementów minimalnych w kolumnach macierzy A min(min(A)) - element najmniejszy w macierzy dwuwymiarowej ndims(A) - ile wymiarów macierzy numel(A) - liczba elementów macierzy reshape(A,n,m) - rekonfiguracja macierzy size(A) - rozmiar macierzy length(A) - największy rozmiar Zadanie Wypróbować i zrozumieć działanie powyższych funkcji. Można tu skorzystać z pomocy Matlaba, pisząc w linii poleceń Command Window: help funkcja Wykorzystanie tablic Wykresy 2D Funkcja plot Wykresy na płaszczyźnie tworzymy wykorzystując funkcję plot(x, y, kolor). Przykład: x=0:10 y=sqrt(x) title('Wykres') plot(x,y) %generowanie wektora: wart_pocz:wart_konc (krok 1) % wektor wartości y %opcjonalnie tytuł wykresu % narysowanie wykresu (w osobnym oknie) Dwie krzywe w jednym układzie współrzędnych: x=0:pi/50:6*pi y=cos(2*x)./sqrt(x+1) z=sin(x) plot(x,y,'b',x,z,'r') grid % definicja wektora % definicja wektora y(x), Uwaga:dzielenie elementowe wektorów % definicja wektora z(x) % (b=blue, r=red) %dodanie siatki do wykresu Funkcja fplot Dla funkcji fplot niepotrzebne są wektory zmiennych – jedynie wyrażenie tekstowe opisujące funkcję: fplot ( ' wyrażenie arytmetyczne (x) ' , [ x_pocz , x_konc ] ) Przykład: fplot('sin(x*x)/x',[0 4*pi]) % uwaga: punkt dzielenia przez 0 nie jest rysowany Można również narysować więcej krzywych na wykresie: fplot('[sin(x*x)/x, cos(x)]',[0 2*pi]) albo fplot('sin(x*x)/x',[0 2*pi]) hold on fplot('cos(x)',[0 2*pi]) Wykresy 3D Krzywe 3D Wykorzystujemy tu funkcję plot3(y,z,x). Przykładowo dla krzywej (helisy) danej równaniami: y=sin(x) z=cos(x) Tworzymy m-plik: x = 0:pi/50:10*pi; plot3(sin(x),cos(x),x); 40 30 20 10 0 1 0.5 1 0.5 0 0 -0.5 -0.5 -1 -1 Powierzchnie 3D Korzystamy z funkcji mesh(x,y,z). Dla powierzchni podanej równaniem: z=cos 3x* sin y Piszemy m-plik: clear y = 0:0.01:pi x = y' z=cos(3*x) * sin(y) mesh(x, y, z) %wektor wierszowy %wektor kolumnowy! %przeanalizować tablicę z (tablica KWADRATOWA!) Operacje iteracyjne na macierzach Przykład 1. Wypełnianie iteracyjne tablicy jednowymiarowej: for i= 1:10, a(i) = 3*i - 1; end; disp(a) Przykład 2. Wypełnienie tablicy dwuwymiarowej (zagnieżdżanie iteracji): for w= 1:5 for k=1:5 M(w,k) = rand; end; end; disp(M) Sumowanie elementów wektora Pseudokod: 1. Wczytaj wartości wektora o rozmiarze N. 2. Wyzeruj zmienną suma. 3. Ustaw licznik na wartość 1. 4. Dodaj do sumy element wektora indeksie równym licznikowi. 5. Zwiększ licznik o 1. 6. Zbadaj czy licznik nie przekracza N, jeśli tak, przejdź do punku 7, jeśli nie, przejdź do punku 4. 7. Wypisz sumę. Schemat blokowy: START wczytaj N, M suma=0 licznik=1 Kod w m+pliku: clear M; N= 10; M=rand(1,N) suma = 0; for i= 1:N, suma=suma+M(i); end fprintf('suma=%f',suma) suma=suma+M(licznik) licznik=licznik+1 licznik>N TAK pisz suma NIE STOP Zliczanie i sumowanie warunkowe Zadanie: Sumuj w wektorze tylko elementy dodatnie. 1. Utworzyć pseudokod algorytmu. 2. Skorygować wykonany uprzednio schemat blokowy wektora (jak wyżej) o dodatkowy blok badania warunku M(k)>0. 3. Napisać kod m-pliku, w którym w pętli badany jest warunek z wykorzystaniem instrukcji if. Zadanie: Policz ile elementów w tablicy jest dodatnich. Wyposażyć powyższy kod o zliczenie elementów spełniających warunek (na wstępie zerujemy zmienną zliczającą, a we wnętrzu instrukcji warunkowej if - dla spełnionego warunku - zwiększamy wartość zmiennej zliczającej o 1). Zadania 1. Wygenerować losowo kwadratową macierz dwuwymiarową i sumować elementy podmacierzy dolnej (elementy poniżej przekątnej głównej włącznie z przekątną). Wskazówka: W pętlach zagnieżdżanych wewnętrzna pętla powinna mieć ograniczenie górne licznika kolumn uzależnione od licznika wierszy pętli zewnętrznej. 2. Wykonać kod m-pliku, który: a. generuje wektor o 30 elementach, zawierający liczby całkowite z przedziału (0, 100) b. zliczyć ile z tych liczb jest równych 26. c. zliczyć ile z tych liczb jest z przedziału [40, 60] Wyszukiwanie ekstremum w tablicy jednowymiarowej Algorytm wyszukiwania ekstremum polega na wstępnym założeniu, że pierwszy element tablicy jest minimalny (maksymalny). Następnie badane są kolejne elementy i w przypadku gdy element jest mniejszy (większy) od aktualnego ekstremum ustawiane jest nowe ekstremum. Pseudokod algorytmu wyszukiwania minimum w tablicy jednowymiarowej wygląda następująco. 1. Wczytaj wektor. 2. Nadaj dla N_min wartość pierwszego elementu wektora. 3. Ustaw licznik na 2. 4. Sprawdź czy element wektora o indeksie równym licznikowi jest mniejszy od N_min. Jeśli tak, to wstaw go do N_min. 5. Zwiększ licznik o 1. 6. Sprawdź czy licznik nie przekracza rozmiaru wektora. Jeśli tak to skocz do punktu 8. Jeśli nie skocz do punktu 4. 7. Wypisz N_min. Zadanie Narysować schemat blokowy powyższego algorytmu i zrealizować w m-pliku kod programu. Sortowanie bąbelkowe wektora Algorytm polega porównywaniu kolejnych par elementów sąsiadujących i zamianie miejscami w przypadku niewłaściwej kolejności. 1 2 3 4 ..... N-1 N Po wykonaniu pierwszego przebiegu N-1 porównań i ewentualnych zamian miejscami (z wykorzystaniem zmiennej pomocniczej), element największy znajdzie się na końcu (w przypadku porządku sortowania według kolejności rosnącej). W kolejnym przebiegu liczbę porównań zmniejszamy o 1 – ostatnie porównanie nie jest potrzebne, gdyż największy element jest już na właściwym miejscu. Ogólnie wykonujemy N-1 przebiegów. Oto kod m-pliku: clear M, clc N= 10; disp('Wektor wyjściowy') M=round(rand(1,N)*100) for i= 1:N-1 % N-1 przebiegów for k=1:N-i % w każdym przebiegu zmniejsza się liczba porównań if M(k)>M(k+1) pom=M(k); zamiana miejscami M(k)=M(k+1); M(k+1)=pom; end; end; end disp('Rosnąco') disp(M) Zadania 1. Zrozumieć i sprawdzić działanie powyższego kodu sortowania wektora. 2. Skorygować kod tak, aby sortowanie spowodowało porządek malejący.