Ć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.