Matlab - obliczenia statystyczne Rekurencja Inne typy danych
Transkrypt
Matlab - obliczenia statystyczne Rekurencja Inne typy danych
MPDI2 Wykład 12 Matlab - obliczenia statystyczne Rekurencja Inne typy danych 1 Wybrane funkcje statystyczne w Matlabie Sumowanie elementów wektora: sum(A) Sortowanie elementów wektora: sort(A) - rosnąco sort(A,'descend') - malejąco Liczba elementów wektora: length(A) Średnia arytmetyczna: mean(A) Mediana: median(A) Odchylenie standardowe: std(A) – dla próby std(A,1) – dla populacji Wariancja: var(A) – dla próby var(A,1) – dla populacji 2 Można sobie poradzić stosując iterację: clc, clear M=rand(1,100) suma=0; for k=1:length(M) suma=suma+M(k); end; suma srednia=suma/length(M) %sprawdzenie- funkcje wbudowane sum_s=sum(M) sr_s=mean(M) suma = 52.7994 srednia = 0.5280 sum_s = 52.7994 sr_s = 0.5280 3 Mediana Mediana to wartość środkowa zbioru. Wartość mediany wskazuje, że połowa wyników ma wartość poniżej wartości mediany, a druga połowa ma wartość powyżej wartości mediany. clc, clear M=rand(1,101); M=sort(M) %sortujemy rosnąco if rem(length(M),2)==1 med= M((length(M)+1)/2) else med= (M(length(M)/2)+M(length(M)/2+1))/2 end %sprawdzenie funkcji wbudowanej med_s= median(M) med = 0.5472 med_s = 0.5472 4 Wariancja i odchylenie standardowe dla próby Badamy próbę, czyli podzbiór pełnego zbioru (całej populacji) Wariancja określa wielkość zróżnicowania wyników w zbiorze - czy różnice pomiędzy średnią a poszczególnymi wynikami są duże czy niewielkie. Odchylenie standardowe próby: 5 Wariancja i odchylenie standardowe dla populacji Badamy całą populację Wariancja populacji: Odchylenie standardowe populacji: 6 Obliczenia iteracyjne dla próby clear,clc N=100; % liczebność całej populacji M=rand(1,N); %średnia próby P=50; %liczebność próby sr_pr=sum(M(1:P))/P; s_pr=0; for k=1:P s_pr=s_pr+(M(k)-sr_pr)^2; end; war_pr=s_pr/(P-1); %WARIANCJA std_pr=sqrt(war_pr); %ODCHYLENIE STANDARDOWE fprintf('Wariancja dla próby=%f\n',war_pr) fprintf('Odchylenie dla próby=%f\n',std_pr) %sprawdzenie fprintf('war3_pr=%f\n',var(M(1:P))) %WARIANCJA fprintf('std3_pr=%f\n',std(M(1:P))) %ODCHYLENIE 7 Można też obliczać średnią geometryczną czyli Do wyznaczania iloczynu wszystkich elementów wektora służyć może funkcja prod(M) Spróbować samodzielnie rozwiązać problem 8 Rozkład Gaussa clc syms x sigma mi f=1/sqrt(2*pi)/sigma*exp(-(x-mi)^2/2/sigma^2) mi=0; %mediana sigma=1; f1=subs(f) ezplot(f1,[-4 4]) 2 7186705221432913 /18014398509481984 exp(-1/2 x ) 0.4 0.35 0.3 0.25 0.2 0.15 0.1 0.05 0 -4 -3 -2 -1 0 x 1 2 3 4 9 Algorytmy rekurencyjne Wiele problemów obliczeniowych można zdefiniować rekurencyjnie. Rekurencja oznacza takie zdefiniowanie zagadnienia, gdzie w trakcie formułowania definicji odwołujemy się do niej samej. Przykładem definicji rekurencyjnej może być zapis całkowitej, nieujemnej potęgi rzędu n liczby rzeczywistej x: xn-1*x dla n > 0 xn = 1 (tu użycie definiowanej potęgi) dla n = 0 10 Rekurencja w językach programowania jest realizowana za pomocą podprogramów wywołujących kolejno same siebie ze zmienianymi parametrami wywołania. Aby podprogramy rekurencyjne działały poprawnie powinny zawierać warunek zakończenia rekurencji, aby wywołanie wykonywane było skończoną liczbę razy. Rekurencja daje proste programy lecz ma także wadę: każde wywołanie podprogramu wymaga wykonania przez procesor dodatkowych czynności, co spowalnia działanie programu oraz powoduje odłożenie na stos systemowy dużej liczby danych 11 W Matlabie zapisalibyśmy tak: function s=silnia (x) % Funkcja wyznacza silnię liczby x if x==1 s = 1; else s = silnia(x – 1)*x ; end ; {w definicji funkcji wykorzystanie samej funkcji} Matlab jednak nie dopuszcza takiej konstrukcji, a inne języki programowania dopuszczają 12 Typy danych Poznaliśmy… Liczbowe: x=4.6 y= 3+4i rzeczywiste zespolone Tekstowe (łańcuchowe): x= 'Politechnika' Tablicowe (homogeniczne): x= [ 1 2; 4 5] y= ['a' 'b'; 'c' 'd' ] ten sam typ danych Logiczne: x=true y=false 13 Tablice komórkowe (ang. cell - heterogeniczne) Tablica, w której każdy element może być innego typu, w tym także typu złożonego. Zawartość takiej tablicy wpisujemy podobnie jak w tablicach homogenicznych lecz w nawiasach klamrowych { } (nie prostokątnych). oceny ={'fizyka', 3.5; 'informatyka', 4.0; 'mechanika',5.0} disp(oceny(1,1)) oceny = 'fizyka' [3.5000] 'informatyka' [ 4] 'mechanika' [ 5] 'fizyka' 14 Tablice struktur (ang. struct) Jej elementami są rekordy złożone z pól przechowujących wartości różnego typu i identyfikowanych przez swoje nazwy. W innych językach, w tym w językach obsługi baz danych, noszą nazwę typu rekordowego 15 Tablice struktur można definiować na dwa sposoby: a) Definiowanie z użyciem struct Przykład: student = struct('Nazwisko', 'Kowalski', 'Imie', 'Jan', 'Wiek', 23) b) Definiowanie przez przypisywanie wartości kolejnych pól. Nazwy pól oddzielamy kropką od nazwy tablicy lub jej elementu. W ten sposób możemy zarówno definiować pola nowej struktury jak i dodawać nowe pole do już istniejącego rekordu: student.grupa=1 16 W innych językach programowania występują typy danych: Typ wyliczeniowy Konieczna jest definicja typu dni_tygodnia=(pn, wt, sr, cz, pi, so, ni) I definicja zmiennej: x: dni_tygodnia x należy do typu dni_tygodnia Teraz w programie można używać zmiennej x: x = wt Zmienna przyjmuje jedną (!) wartość ze zbioru dopuszczalnych wartości Wartość wt ma charakter abstrakcyjny (umowny) 17 Typ zbiorowy Typ zbiorowy to zbiór potęgowy danego typu porządkowego, czyli zbiór wszystkich podzbiorów tego typu. Zmienna typu zbiorowego może zatem zawierać zbiór pusty, jedno- lub wieloelementowy. Zmienna typu zbiorowego zawierać może dowolny podzbiór elementów typu bazowego, od zbioru pustego do zbioru zawierającego wszystkie elementy. 18 Czyli: Zmienna typu liczbowego całkowitego może mieć wartość 1 lub 100 a nie może jednocześnie 1 i 100! Zmienna typu tablicowego może zawierać wiele wartości i nawet jak komórki są puste, to rezerwują pamięć komputera Zmienna typu zbiorowego może zawierać zero, jedną lub wiele wartości z danego zbioru Zmienne typu zbiorowego 157 19 4 8 34 67 69 88 100 19 Typ zbiorowy może być oparty na typie wyliczeniowym Przykłady: dzien = wt zmienna typu wyliczeniowego weekend= (so, nie) zmienna typu zbiorowego miesiac = luty zmienna typu wyliczeniowego kwartal1= (styczen, luty, marzec) zmienna typu zbiorowego UWAGA: miesiac może przyjąć wartość tylko jednej z nazw – typ wyliczeniowy zmienna typu zbiorowego może przyjąć wartość dowolnego podzbioru z nazw bazowych – typ zbiorowy 20 Operacje logiczne wykonywane na zbiorach to relacje (porównania): A=B równość zbiorów, te same elementy w obu zbiorach, A < > B różność zbiorów, różne elementy w obu zbiorach (chociaż niektóre mogą się powtarzać) A <= B zawieranie zbioru A w zbiorze B (true jeśli każdy element zbioru A jest w zbiorze B) A >= B zawieranie zbioru B w zbiorze A (true jeśli każdy element zbioru B jest w zbiorze A) c in A ma wartość logiczną - czy element c jest w zbiorze A Wartość logiczną sprawdzamy oczywiście wykorzystując instrukcję warunkową if 21 Przykład: Czcionka w aplikacjach Windows definicja zmiennych (język Pascal) x, y , z: set of (pochylony, pogrubiony, podkreslony); wykorzystanie x= [ ] //zbiór pusty y= [pochylony, podkreslony] z= [pochylony, pogrubiony] 22 Operatory działań na zmiennych typu zbiorowego (znaczenie jak w teorii mnogości): + – ∗ suma zbiorów różnica zbiorów iloczyn zbiorów (zbiór x =(2, 3, 4) + (4, 5, 6) y = (2, 3, 4) – (4, 5, 6) v = (2, 3, 4) * (4, 5, 6) y=v*x; wspólny!!!) %wynik (2,3,4,5,6) %wynik (2,3) %wynik (4) (zbiór wspólny) %przeanalizować wynik 23 Podstawowe cechy programowania obiektowego 24 Programowanie strukturalne koncepcja tradycyjna. (proceduralne) – Główną jego składową są instrukcje działające na danych. Złożone programy korzystają z podprogramów (funkcji, procedur, a także modułów grupujących podprogramy) w celu uproszczenia zarządzania i kontroli nad programem, lecz nie zmienia to podstawowej koncepcji. 25 Wady programowania strukturalnego ■ dane są powszechnie dostępne – łatwo o błędy, ■ sekwencyjność wykonywania programu, ■ wszystkie sytuacje trzeba przewidywać i obsługiwać, ■ konieczność testowania po każdej zmianie, ■ wiele instrukcji, obszerny kod, trudność zrozumienia algorytmu 26 Zauważono „Kryzys oprogramowania” – programowanie strukturalne utrudnia panowanie nad bardzo złożonymi systemami informatycznymi SI (rozwój sprzętu wyprzedzał techniki budowania SI). Potrzebne były metody zwiększające wydajność i systematyczność tworzenia SI,a następnie ich wydajność. Poza tym powstały interfejsy graficzne (Windows)! Korzenie technologii obiektowej – lata 60-te, Nygaard i Dohl, Simula 1, Simula67 (1967). 27 OBIEKTOWOŚĆ – filozofia tworzenia na podstawie rzeczywistych zjawisk otaczającego świata (nie tylko język programowania). Obiekty (świata rzeczywistego a także systemu operacyjnego komputera – plik, ikona, przycisk, okno) – mają: właściwości (nazwa, kolor itp.), a także zbiory operacji na nich czy przez nie wykonywanych. 28 Np. typ tablica ma swoje cechy – atrybuty: ■ wymiar ■ rozmiar ■ typ przechowywanych danych nie określa się jednak sposobów operacji na tablicach (np. dodawanie tablic), trzeba do tej operacji tworzyć własne kody lub korzystać z bibliotecznych podprogramów, których użycie wymaga szczegółowego zapoznania się z zestawem parametrów formalnych (sposób użycia). 29 Stworzono tzw. ADT – abstrakcyjny typ danych – podążanie w kierunku naturalnego języka (zbliżenie do rzeczywistości), nazwano modułem (język Modula) lub klasą (język Simula). System reaguje na zdarzenia („siły sprawcze”), efektem są procesy: ■ funkcje przetwarzania parametrów obiektów ■ przesyłu informacji między obiektami ■ oddziaływania jednych obiektów na inne 30 PROGRAMOWANIE OOP – podstawowe pojęcia Programowanie zorientowane obiektowo (OOP – Object Oriented Programming) umożliwia przedstawienie problemu w postaci logicznie powiązanych ze sobą struktur danych zwanych obiektami, wymieniających informacje między sobą. „Obiektowość” opiera się na koncepcyjnym (intuicyjnym) klasyfikowaniu rzeczywistości. Na świat składają się obiekty i procesy w nich zachodzące. 31 Koncepcje (pojęcia) KLASA = typ obiektowy=encja (entity) OBIEKT= instancja w klasie = reprezentacja w klasie, element przechowujący dane Podobnie jak typ zmiennej i zmienna 32 Klasa (typ obiektowy) jest to złożona struktura danych o określonej liczbie atrybutów. Atrybuty klasy dzielimy na: • • pola metody 33 pola (fields) – atrybuty (właściwości opisane wartościami dowolnych typów, także strukturalnych) Pole jest to zmienna, która może być różnego typu. metody (methods) – funkcje wykonywane na polach. Metoda jest czynnością wykonywaną na obiekcie w postaci podprogramu (najczęściej funkcji). Metoda obiektu operuje na polach (danych) obiektu, przy ich pomocy mamy dostęp do pól. Czyli można powiedzieć, że typ obiektowy to typ rekordowy poszerzony o metody 34 Metoda jest to funkcja mająca deklarację w ramach typu obiektowego. Nazwa jest kwalifikowana, tzn. wskazuje na obiekt, którego dotyczy i ma postać: nazwa_obiektu.nazwa_metody(argumenty) .. identycznie jak w strukturach czy rekordach 35 Konstruktor – specjalna metoda używana przy tworzeniu (instancji) obiektu danej klasy – zmienna typu obiektowego Destruktor – specjalna metoda wywoływana automatycznie tuż przed zakończeniem istnienia obiektu (niszczenie obiektu) 36 Przykład – plik Pies.m - definicja klasy Pies classdef Pies<handle properties % właściwości imie='' nogi=4; ileHau = 0; end methods % metody function obj = Pies() % działania inicjacyjne konstruktora end function nadajImie(obj,x) obj.imie=x; end function Hau(obj) fprintf('hauuuuuuuuuu'); obj.ileHau = obj.ileHau + 1; fprintf( ' %d raz\n' ,obj.ileHau) end function ileNog(obj) disp(obj.ileNog); end end end 37 Na bazie powyższej definicji można wykonać nasz m-plik: clc,clear pies1=Pies(); %utworzenie obiektu pies1.nadajImie('Burek'); pies1.Hau(); %wykonanie metody pies1.Hau(); pies1.Hau(); fprintf('Ma nóg:%d\n',pies1.nogi); pies2=Pies(); %utworzenie obiektu pies2.nadajImie('Ciapek'); for k=1:5 pies2.Hau(); %wykonanie metody end for i=1:5 Hau(pies2); end fprintf('%s szczeknął %d razy\n',pies1.imie,pies1.ileHau); fprintf('%s szczeknął %d razy\n',pies2.imie,pies2.ileHau); Rezultat: hauuuuuuuuuu 1 raz hauuuuuuuuuu 2 raz hauuuuuuuuuu 3 raz Ma nóg:4 hauuuuuuuuuu 1 raz hauuuuuuuuuu 2 raz hauuuuuuuuuu 3 raz hauuuuuuuuuu 4 raz hauuuuuuuuuu 5 raz Burek szczeknął 3 razy Ciapek szczeknął 5 razy 38 Inny przykład %definicja klasy classdef Tczlowiek<handle properties waga = 80; end methods function obj = Tczlowiek() % działania inicjacyjne end function jedz(obj, posilek) obj.waga=obj.waga+posilek/20; disp(obj.waga) end end end osoba=Tczlowiek; osoba.jedz(10); aktywowanie metody jedz wpłynie na wagę obiektu osoba, należącej do klasy Tczlowiek 39 Cechy obiektowości • hermetyzacja • polimorfizm • dziedziczenie 40 HERMETYZACJA Własność polegająca na dostępie do pól jedynie przy użyciu metod nazywa się hermetyzacją. Tworzy to dyscyplinę programowania, w jednym miejscu mamy dane i dozwolone operacje na nich. Ułatwia kontrolę poprawności złożonych programów. 41 DZIEDZICZENIE Typ obiektowy może on być: • niezależny, (zdefiniowany podobnie jak typ rekordowy) – rodzic drzewa • jako potomek istniejącego. Wtedy mówimy, że obiekt dziedziczy wszystkie elementy (pola i metody) swojego przodka lub jest typem potomnym. Obiekty potomne mogą mieć własnego potomka (lub wielu). 42 Wzajemne zależności obiektów układają się w drzewo hierarchii obiektów. Dziedziczność bezpośrednia – przodek jest niezależny (sam nie ma przodka) Dziedziczność pośrednia – przodek już dziedziczy (sam ma przodka) Przykład dziedziczenia klas: polozenie = class {typ niezależny} x; y; end; punkt = class (polozenie) widocznosc; end; {typ potomny} 43 POLIMORFIZM Potomek może mieć tę samą nazwę metody jak przodek, „przykrywa” ona wówczas metodę przodka. Definiując metodę potomka (rozwijając ją lub modyfikując, np. gdy jest ona rozszerzeniem metody nadrzędnej), można odwołać się do metody dziedziczonej od przodka. Jest to tzw. POLIMORFIZM Polimorfizm (wielopostaciowość) - wykorzystanie tzw. metod wirtualnych. 44 Przykład: polozenie = class x y function przesun (nx, ny); x=x+nx; y=y+ny; end; end 45 TYPY DYNAMICZNE Cel podstawowy – oszczędność pamięci, w języku Matlaba możemy zmieniać wielkość elementu Np. tablice są dynamiczne – możemy zmieniać rozmiary): M=[1 1;2 2] M(3,3)=1; M 1 1 2 2 1 2 0 1 0 2 0 0 1 zwiększyliśmy rozmiar tablicy – w innych językach może to być niemożliwe bez stosowania typów dynamicznych (wskaźnikowych) Struktury w Matlabie też są dynamiczne – możemy dodawać nowe 46 pola ZASADY Do zbioru (uporządkowanego według określonej metody) możemy dołączać nowe elementy. Rozmiar elementu nie jest zdefiniowany, każde dołączanie nowego elementu powoduje nową rezerwację pamięci. Pobieranie elementu, jego usuwanie, dołączanie nowego elementu – mogą być obarczone pewnymi kryteriami dostępu. W językach programowania pozwalających na dostęp do pamięci stosuje się tzw. zmienne wskaźnikowe – wskaźnik jest logicznym adresem w pamięci Zwykle istnieje też specjalny symbol, który określa wskazanie jako puste. W językach C jest to NULL, w C++ nullptr, w Pascalu nil 47 Rodzaje typów dynamicznych Lista jednokierunkowa dane adres musi być znane wskazanie (adres) p początku listy dane adres dane adres dane nil koniec Lista jednokierunkowa może być "w przód" lub "wstecz", czyli element może zawierać wskaźnik na następny lub poprzedni element. 48 Lista dwukierunkowa Jest to liniowo uporządkowany zbiór składników, w którym dla każdego składnika (poza pierwszym i ostatnim), jest określony składnik poprzedni i następny. Dla ostatniego składnika listy dwukierunkowej jest określony tylko składnik poprzedni, a dla pierwszego tylko następny. dane wskaźnik na poprzedni wskaźnik na następny 49 Stos (stack) Jest to struktura danych, składająca się z liniowo uporządkowanych zbiorów składników (elementów), z których tylko ostatnio dołączony jest w danej chwili dostępny. Miejsce dostępu to wierzchołek stosu. Jest to jedyne miejsce, do którego można dołączyć lub z którego można usunąć elementy. FILO lub LIFO first in – last out last in - first out 50 Kolejka (queue) Jest t struktura danych, składająca się z liniowo uporządkowanych zbiorów składników, do której można dołączyć składnik tylko na jednym końcu (koniec kolejki), a usunąć tylko w drugim końcu (początek kolejki). Powiązanie między składnikami kolejki jest takie samo jak pomiędzy składnikami stosu. FIFO first in – first out 51 Drzewo binarne jest strukturą danych, składającą się nieliniowo uporządkowanych zbiorów składników. Do każdego składnika można dołączyć jeden lub dwa składniki. Drzewo ma swój "korzeń" z którego wyrasta struktura. dane wsk_lewe wsk_prawe dane wsk_lewe nil dane nil nil dane wsk_lewe wsk_prawe dane nil nil dane nil nil Drzewo binarne, w którym liczba synów każdego wierzchołka wynosi albo zero albo dwa, nazywane jest drzewem regularnym 52 KONIEC 53