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

Podobne dokumenty