Wprowadzenie do środowiska Matlabmichalbereta.pl/dydaktyka/KPO/Lab1/Matlab wprowadzenie.pdf ·...
Transcript of Wprowadzenie do środowiska Matlabmichalbereta.pl/dydaktyka/KPO/Lab1/Matlab wprowadzenie.pdf ·...
-
Wprowadzenie do środowiska Matlabna potrzeby przedmiotu
Komputerowe Przetwarzanie ObrazuInstytut Modelowania Komputerowego
Politechnika Krakowska
Ustawianie ścieżki do katalogówDostęp do katalogów ustawia się w oknie Path Browser wywołanym przez File/Set Path. Save Path zapisuje modyfikacje ścieżek do pliku pathdef.m.
Definicja zmiennych, wektorów i macierzy
W Matlabie podstawową forma reprezentacji zmiennych jest macierz. Obejmuje to macierze jednowymiarowe (czyli wektory), macierze wielowymiarowe jak również macierz zmienne skalarne, które reprezentowane są jako macierz 1x1.
Przykład 1:
>> x = 22
x =
22
>> whos Name Size Bytes Class
x 1x1 8 double array
Grand total is 1 element using 8 bytes
>>
Zmienna x jest reprezentowana jako macierz 1x1.
Przykład 2: wektor poziomy
>> y = [1 2 3 4]
y =
1 2 3 4
>> whos y Name Size Bytes Class
y 1x4 32 double array
Grand total is 4 elements using 32 bytes
Przykład 3: wektor pionowy
-
>> y = [1 ; 2 ; 3 ; 4]
y =
1 2 3 4
>> whos y Name Size Bytes Class
y 4x1 32 double array
Grand total is 4 elements using 32 bytes
lub przez transpozycję, którą w Matlabie zapisujemy jako ' (apostrof)
>> z = [1 2 3 4]
z =
1 2 3 4
>> z = z'
z =
1 2 3 4
Można też:
>> z2 = [1 2 3 4]'
z2 =
1 2 3 4
Tworzenie macierzy dwuwymiarowych.
Przykład 4: macierz pusta
>> m = []
m =
[]
-
Przkład: macierz 3x4
>> m = [1 2 3 4 ; 5 6 7 8 ; 9 10 11 12]
m =
1 2 3 4 5 6 7 8 9 10 11 12
Poszczególne wiersze oddzielone są średnikiem.Bardzo często przydatne są też funkcję tworzące macierze pewnego typu.
eye(... , ...) tworzy macierz jednostkową (z jedynkami na diagonali)
>> eye(3,3)
ans =
1 0 0 0 1 0 0 0 1
Inne podobne funkcje, których znaczenie jest oczywiste, to:
>> ones(2,3)
ans =
1 1 1 1 1 1
>> zeros(3,2)
ans =
0 0 0 0 0 0
>> rand(2,2)
ans =
0.9501 0.6068 0.2311 0.4860
>> randn(2,2)
ans =
-
-0.4326 0.1253 -1.6656 0.2877
rand(...) zwraca macierz z losowymi wartościami o rozkładzie równomiernym, a randn(...) o rozkładzie normalnym.
Zmienna ans zawsze przechowuje wynik ostatniej operacji.
Odnoszenie się do pojedynczych elementów macierzy odbywa się poprzez indeksy.
>> x = rand(2,3)
x =
0.8913 0.4565 0.8214 0.7621 0.0185 0.4447
>> x(1, 2)
ans =
0.4565
Indeksowanie jest od 1 a nie od zera !
Przypisanie wartości jest analogiczne:
>> x(1, 2) = 222
x =
0.8913 222.0000 0.8214 0.7621 0.0185 0.4447
Można również posługiwać się zakresami, zarówno podczas tworzenia macierzy jak i odnoszenia się do ich elementów.
Przykład 5: wektor z elementami od 1 do 10
>> v = 1:10
v =
1 2 3 4 5 6 7 8 9 10
Przykład 6: wektor z elementami od 1 do 10 z krokiem 0.8
>> v = 1:0.8:10
v =
1.0000 1.8000 2.6000 3.4000 4.2000 5.0000 5.8000 6.6000 7.4000 8.2000 9.0000 9.8000
-
Podobnie dla macierzy:
>> m = [ 1:2:10 ; 2:0.5:4]
m =
1.0000 3.0000 5.0000 7.0000 9.0000 2.0000 2.5000 3.0000 3.5000 4.0000
Jeśli z macierzy chcemy pobrać np. drugą kolumnę lub trzeci wiersz, możemy napisać:
>> x = rand(3,4)
x =
0.6154 0.7382 0.9355 0.8936 0.7919 0.1763 0.9169 0.0579 0.9218 0.4057 0.4103 0.3529
>> y = x(:,2)
y =
0.7382 0.1763 0.4057
>> z = x(3,:)
z =
0.9218 0.4057 0.4103 0.3529
Albo bardziej skomplikowany „wycinek” z macierzy, np. wiersze od 2 do 4 oraz kolumny od 3 do 5:
>> x = rand(5,6)
x =
0.8132 0.6038 0.4451 0.5252 0.6813 0.4289 0.0099 0.2722 0.9318 0.2026 0.3795 0.3046 0.1389 0.1988 0.4660 0.6721 0.8318 0.1897 0.2028 0.0153 0.4186 0.8381 0.5028 0.1934 0.1987 0.7468 0.8462 0.0196 0.7095 0.6822
>> y = x(2:4,3:5)
y =
0.9318 0.2026 0.3795 0.4660 0.6721 0.8318 0.4186 0.8381 0.5028
-
W podobny sposób można robić również podstawienia:
>> x = rand(2,3)
x =
0.3028 0.1509 0.3784 0.5417 0.6979 0.8600
>> y = [ 22 22 22 ]
y =
22 22 22
>> x(1,:) = y
x =
22.0000 22.0000 22.0000 0.5417 0.6979 0.8600
Można też usunąć np. drugi wiersz danej macierzy w taki sposób:
>> x = rand(3,4)
x =
0.1365 0.1991 0.2844 0.9883 0.0118 0.2987 0.4692 0.5828 0.8939 0.6614 0.0648 0.4235
>> x(2,:) = []
x =
0.1365 0.1991 0.2844 0.9883 0.8939 0.6614 0.0648 0.4235
Co się stanie, jeśli macierz x przypiszemy do zmiennej y a następnie zmienimy wartości elementów w y? Czy zmiana jest widoczna w x? Inaczej rzecz ujmując, czy operacja y = x dokonuje „głębokiej” kopii x, czy tylko kopuje referencje do x?
>> x = zeros(3)
x =
0 0 0 0 0 0 0 0 0
>> y = x
-
y =
0 0 0 0 0 0 0 0 0
>> y(1,1) = 22
y =
22 0 0 0 0 0 0 0 0
>> x
x =
0 0 0 0 0 0 0 0 0
Operacje na macierzach.
Dwie macierze można pomnożyć, jeśli mają odpowiednie wymiary, tzn. jeśli liczba kolumn pierwszej jest równa liczbie wierszy drugiej.
Przykład 7:
>> x = rand(3,2)
x =
0.8537 0.8998 0.5936 0.8216 0.4966 0.6449
>> y = rand(2,4)
y =
0.8180 0.3420 0.3412 0.7271 0.6602 0.2897 0.5341 0.3093
>> z = x * y
z =
1.2923 0.5526 0.7718 0.8990 1.0280 0.4410 0.6413 0.6857 0.8320 0.3567 0.5139 0.5605
Natomiast:
-
>> x = rand(3,2)
x =
0.8385 0.7027 0.5681 0.5466 0.3704 0.4449
>> y = rand(3,4)
y =
0.6946 0.9568 0.1730 0.2523 0.6213 0.5226 0.9797 0.8757 0.7948 0.8801 0.2714 0.7373
>> z = x * y??? Error using ==> *Inner matrix dimensions must agree.
Pewnym wyjątkiem jest macierz 1x1, która reprezentuje wartość skalarną:
>> a = 22
a =
22
>> x = ones(3)
x =
1 1 1 1 1 1 1 1 1
>> x = a*x
x =
22 22 22 22 22 22 22 22 22
Jak widać, każdy element macierzy został pomnożony przez wartość 22.
Oprócz operacji macierzowych, przez dodanie . (kropki) przy znaku działania, możemy wykonać dane działanie element po elemencie. Porównaj na przykład operacje macierzową mnożenia:
>> x = 2 * ones(2)
x =
-
2 2 2 2
>> y = 3 * ones(2)
y =
3 3 3 3
>> z = x * y
z =
12 12 12 12
>> z = x .* y
z =
6 6 6 6
Inny przykład – chcemy każdy element macierzy (a nie całą macierz) podnieść do potęgi 3:
>> x = 2 * ones(2)
x =
2 2 2 2
>> x = x .^ 3
x =
8 8 8 8
Podczas gdy podniesienie macierzy do potęgi 3 daje:
>> x = 2 * ones(2)
x =
2 2 2 2
>> x = x^3
x =
32 32 32 32
-
Inne operacje na macierzach
A(:,end) - wypisanie ostatniej kolumnyA(end,:) - ostatni wierszsize(A) – pobieranie rozmiaru macierzy
>> x = rand(3,4)
x =
0.9901 0.4983 0.3200 0.4120 0.7889 0.2140 0.9601 0.7446 0.4387 0.6435 0.7266 0.2679
>> size(x)
ans =
3 4
>> [wiersze, kolumny] = size(x)
wiersze =
3
kolumny =
4
Tablice wielowymiarowe.Można również pracować z macierzami w większej niż 2 liczbie wymiarów.
>> x = ones(2,3, 2)
x(:,:,1) =
1 1 1 1 1 1
x(:,:,2) =
1 1 1 1 1 1
>> x(:,:,2) = x(:,:,2) * 22
x(:,:,1) =
1 1 1 1 1 1
-
x(:,:,2) =
22 22 22 22 22 22
>> x(2,1,1) = 333
x(:,:,1) =
1 1 1 333 1 1
x(:,:,2) =
22 22 22 22 22 22
-
Operacje arytmetyczne:Dodawanie C=A+B dodawanie Odejmowanie analogicznieMnożenie tablic „*”C = A * B mnożenie macierzy (suma iloczynów i-tego wiersza macierzy A i k-tej kolumny
macierzy B)C=A.*B operacja tablicowa (mnożenie elementów o tych samych indeksach)DzielenieAnalogicznieW rachunku tablicowymC=A./BPotęgowanie C=A.^2 podniesienie do kwadratuPierwiastkowanieC=sqrt(A)Operacje transponowania „’ ”, operacje odwracania „inv”Transpozycja macierzy A.’Macierz odwrotnaC=inv(B)
< A= A>=B Większy lub równy== A==B Równy ~= A~=B Różny od& and(A,B) AND – iloczyn logiczny| or(A,B) OR – suma logiczna~ not(A) NOT - negacja
Xor xor(A,B) EXCLUSIVE OR – suma rozłączna
Przykład 8:
-
>> x = rand(2,3)
x =
0.0164 0.5869 0.3676 0.1901 0.0576 0.6315
>> y = rand(2,3)
y =
0.7176 0.0841 0.4418 0.6927 0.4544 0.3533
>> x < y
ans =
1 0 1 1 1 0
Jedynki wskazują te elementy, dla których warunek jest TRUE.
Inne operacje:any(A) – zwraca 1 jeżeli któryś z elementów kolumny jest niezerowyall(A)- zwraca 1 jeżeli wszystkie elementy kolumny są niezerowefind – wyszukuje elementy spełniające dany warunek logiczny i
„all” oraz „any” działają na kolumnach macierzy lub w przypadku wielowymiarowej – na pierwszym niejednoelementowym wymiarze
Przykład 9: wyzerować elementy w x większe od 0.5x =
0.1536 0.6992 0.4784 0.6756 0.7275 0.5548
>> indx = find( x > 0.5 )
indx =
2 3 4 6
>> x(indx) = 0
x =
0.1536 0 0.4784 0 0 0
Lub krócej:x =
-
0.1210 0.7159 0.2731 0.4508 0.8928 0.2548
>> x( find(x>0.5) ) = 0
x =
0.1210 0 0.2731 0.4508 0 0.2548
Zadanie: Dla dwóch macierzy o tym samym rozmiarze wyzeruj elementy na tych pozycjach, na których się różnią.
Zadanie: Wypróbuj następujące funkcje:ZaokrągleniaWprowadzić wektor x = [2.2, -3.6; -4.7, 8.1]ceil (x) % zaokrąglenie w góręans = 3 -3 -4 9
fix(x) % zaokrąglenie przez odcięcieans = 2 -3 -4 8
floor(x) % w dółans = 2 -4 -5 8
round(x) % do najbliższej całkowitejans = 2 -4 -5 8
abs(x) % wartość bezwzględnaans = 2.2000 3.6000 4.7000 8.1000
Budowa skryptu (tzw. M-pliku)
Plik zawierający skrypt Matlaba (m-plik) to zwykły plik tekstowy zapisany z rozszerzeniem .m. Może zawierać sekwencje poleceń Matlab’a lub/i wywołania innych m-plikówMoże wywoływać sam siebie.
-
Są dwa rodzaje plików: skryptowe i funkcyjne.
Skryptowe zawierają ciągi poleceń i działają na zmiennych dostępnych w przestrzeni roboczejmogą służyć do wprowadzania większej ilości danych, zapisu wyników, uproszczenia powtarzających się sekwencji, zapisu algorytmów. Mogą powstać konflikty nazw zmiennych w przestrzeni roboczej.
Funkcyjne - algorytm funkcji na zmiennych lokalnych lub globalnych z przestrzenią roboczą Komunikują się przez zmienne globalne (definiowane poleceniem „global”) lub/i parametry formalnemuszą zaczynać się od „function”.
function[lista argumentów wyjściowych]=nazwa_funkcji(lista argumentów wejściowych)
Argumenty wejściowe i wyjściowe mają charakter lokalny.Nawias [] opuszcza się jeżeli jest jeden lub brak parametrów wyjściowych.
Przykład 10:
Zapisać jako pitagoras.m
Funkcja pitagoras zwraca jedną wartość, mianowicie c. Zwróć uwagę, że a, b oraz c mogą być macierzami.
Przykład wywołania:
>> x = pitagoras(3,4)
temp =
25
-
c =
5
x =
5
A dla macierzy otrzymamy również poprawny wynik:
>> a = [1 2; 3 4]
a =
1 2 3 4
>> b = [2 3; 4 5]
b =
2 3 4 5
>> x = pitagoras(a,b)
temp =
5 13 25 41
c =
2.2361 3.6056 5.0000 6.4031
x =
2.2361 3.6056 5.0000 6.4031
Przykład funkcji, która nic nie zwraca. Pokazuje również jak wypisywać tekst oraz pobierać dane z klawiatury.
-
>> hello(3)
hello, przeslales 3.000000
podaj nowa wartosc:22
x =
22
nacisnij cos by zakonczyc...
do widzenia!
Zadanie: Sprawdź co się stanie po wywołaniu:>> x = 33
x =
33
>> hello(x)
hello, przeslales 33.000000
podaj nowa wartosc:22
x =
22
nacisnij cos by zakonczyc...
do widzenia!
>> x
.....
Jaka będzie wartość x? Czy zmiana na 22 wewnątrz funkcji zmieniła wartość x w miejscu wywołania
-
czy zmieniła tylko kopie lokalną? Jaka będzie sytuacja, jeśli funkcja otrzyma macierz? Czy też wykona kopię głęboką tej macierzy?
Oto funkcja, która zwraca dwie wartości (analogicznie jest dla trzech i więcej). Średnik na końcu linijki oznacza brak wypisania wyniku operacji na konsoli.
Wywołanie:
>> a = 3*ones(2)
a =
3 3 3 3
>> b = 2*ones(2)
b =
2 2 2 2
>> [xx yy] = mojafunkcja(a,b)
xx =
6 6 6 6
yy =
-
5 5 5 5
Korzystanie z help'a:
>> help mojafunkcja
To jest opis funkcji
A teraz krótki skrypt, który nie definiuje żadnej funkcji, ale za to pozwala zapisać i wykonać kilka operacji razem – w tym przypadku narysujemy wykres funkcji sinus oraz cosinus.
Wywołanie:
>> sinus
Zmienne globalne (dostępne wszędzie – nawet w funkcjach) definiuje się za pomocą słowka global.
Typy zmiennych w Matlabie
Programowanie
-
Słowa kluczowe
>> iskeyword
ans =
'break' 'case' 'catch' 'continue' 'else' 'elseif' 'end' 'for' 'function' 'global' 'if' 'otherwise' 'persistent' 'return' 'switch' 'try' 'while'
if, else, elseif
if logical_expression statementsend
Np.
if n < 0 % If n negative, display error message. disp('Input must be positive');elseif rem(n,2) == 0 % If n positive and even, divide by 2. A = n/2;else A = (n+1)/2; % If n positive and odd, increment and divide.end
switch
switch expression (scalar or string) case value1 statements % Executes if expression is value1 case value2 statements % Executes if expression is value2 . otherwise statements % Executes if expression does not match any caseend
-
Np.
switch input_num case -1 disp('negative one'); case 0 disp('zero'); case 1 disp('positive one'); otherwise disp('other value');end
while
while expression statementsend
Np.
n = 1;while prod(1:n) < 1e100 n = n + 1;end
for
for index = start:increment:end statementsend
Np.
for i = 1:m for j = 1:n A(i,j) = 1/(i + j - 1); endend
continue
Np.
fid = fopen('magic.m','r');count = 0;while ~feof(fid) line = fgetl(fid); if isempty(line) | strncmp(line,'%',1) continue end count = count + 1;
-
enddisp(sprintf('%d lines',count));
break
Np.
fid = fopen('fft.m','r');s = '';while ~feof(fid) line = fgetl(fid); if isempty(line) break end s = strvcat(s,line);enddisp(s)
Proste przykłady z przetwarzania obrazu
Wpisz help imread aby sprawdzić jakie typy plików graficznych obsługuje Matlab.
Przykład 11: m-plik simple_image_proc.m
imfinfo('portret.jpg')disp('dalej...'); pauseim = imread('portret.jpg');imshow(im)disp('dalej...'); pause
disp('zmiana mapy kolorow na hsv'); colormap(hsv)disp('dalej...'); pause
disp('zmiana mapy kolorow na jet'); colormap(jet)disp('dalej...'); pause
disp('zmiana mapy kolorow na losowa o 2 barwach'); colormap( rand(2,3) )disp('dalej...'); pause
disp('zmiana mapy kolorow na losowa o 4 barwach'); colormap( rand(4,3) )disp('dalej...'); pause
disp('zmiana mapy kolorow na losowa o 8 barwach'); colormap( rand(8,3) )disp('dalej...'); pause
disp('zmiana mapy kolorow na losowa o 12 barwach'); colormap( rand(12,3) )
-
disp('dalej...'); pause
disp('koniec...');
Przykład 12: m-plik simple_image_proc2.m
imfinfo('e0102.bmp')disp('dalej...'); pauseim = imread('e0102.bmp');imshow(im)disp('dalej...'); pause
disp('tylko skladowa czerwona jako czarno-biala')imshow(im(:,:,1))disp('dalej...'); pause
disp('tylko skladowa zielona jako czarno-biala')imshow(im(:,:,2))disp('dalej...'); pause
disp('tylko skladowa niebieska jako czarno-biala')imshow(im(:,:,3))disp('dalej...'); pause
disp('tylko skladowa czerwona z mapa kolorow')imshow(im(:,:,1))map = zeros(256, 3)map(:,1) = [0:(1/255):1]'colormap(map)disp('dalej...'); pause
disp('tylko skladowa zielona z mapa kolorow')imshow(im(:,:,2))map = zeros(256, 3)map(:,2) = [0:(1/255):1]'colormap(map)disp('dalej...'); pause
disp('tylko skladowa niebieska z mapa kolorow')imshow(im(:,:,3))map = zeros(256, 3)map(:,3) = [0:(1/255):1]'colormap(map)disp('dalej...'); pause
disp('koniec');
Sprawdzanie typu obrazu:
isbw(A) – sprawdza, czy obraz jest binarnyisgray(A) – sprawdza, czy obraz jest obrazem o poziomach szarościisind(A) – sprawdza, czy obraz jest opisany macierzą indeksówisrgb(A) – sprawdza, czy obraz jest obrazem rgb
-
Inne informacje
Znaki specjalne = przypisanie wartości[ ] tworzenie tablic, argumenty wyjściowe funkcji, łączenie macierzy (deklar. wartości, po=]{ }indeksy struktur i tablic komórkowych( ) argumenty wejściowe funkcji, indeksy tablic, nawiasy potrzebne do określenia kolejności działań (nigdy po =,). kropka dziesiętna, separator nazw obiektów, zamiana operacji macierzowej na tablicową… kontynuacja polecenia w następnym wierszu, separator poleceń, indeksów, argumentów funkcji; koniec wiersza macierzy, wstrzymanie wypisania wyniku% początek komentarza: generowanie wektorów, indeksowanie macierzy,‘ łańcuch (apostrof przed i po), operator transpozycji macierzy (po) lub sprzężenia
Predefiniowane stałeInf (infinitive) to ∞1/0log(0) Uwaga:Inf-Inf and Inf/Inf dają w wyniku NaN (Not-a-Number)
NaN (Not-a-Number)Wynik każdej operacji na NaN, np sqrt(NaN) (+Inf)+(-Inf) 0*Inf 0/0 oraz Inf/Inf
Uwaga:Dwie NaN nie są sobie równe, zatem operacja logiczne na NaN dają zawsze 0 (fałsz), za wyjątkiem ~= (różny, nie równy)
NaN ~= NaN ans = 1NaN == NaNans = 0NaN-y w wektorze traktowane jako różne niepowtarzalne elementy
unique([1 1 NaN NaN]) %znajdź różne elementy wektoraans = 1 NaN NaNisnan([1 1 NaN NaN]) % isnan służy do wykrywania NaN w macierzy, zwraca 1, jeżeli jest gdzieś NaNans = 0 0 1 1