Programowanie Matlaba
Operacje na macierzach: * - mnożenie / - dzielenie \ - dzielenie lewostronne ^ - potęgowanie + - dodawanie - - odejmowanie ' - transponowanie sprzężone .' - transponowanie niesprzężone [] - łączenie
Operacje na tablicach/skalarach .* - mnożenie ./ - dzielenie .\ - dzielenie lewostronne .^ - potęgowanie + - dodawanie - - odejmowanie
Indeksowanie tablic/macierzy Indeksowanie tablic wykonuje się wyrażeniem w postaci A(N,M) gdzie N i M są w ogólności wektorami np.: jeden_element = A(1,1) pierwszy_wiersz = A(1,1:4) pierwsza_kolumna = A(1:2,1) inny_przyklad = C([1 2 1], 1:2:5) Symbol end pierwszy_wiersz = A(1,1:end) Symbol end może być stosowany w indeksowaniu odwrotnym pierwsza_kolumna = A(end:-1:1,1) % Samodzielny znak dwukropka pierwszy_wiersz = A(1,:) Tablicę można indeksować jednym indeksem Tablicę można indeksować tablicą logiczną
Tablice komórkowe Cell Arrays np. C = {[1] [2 3] [1 2; 3 4] ; ones(3,3) 'wynik' @permute} Wybieranie elementów/indeksowanie C{1,3} C{4} Najczęstsze zastosowania Teksty C = {'poczatek' 'kontynuacja' 'koniec'} Elementy o różnym rozmiarze
Tablice komórkowe xxx2=['17:30' ;'18:00'; '18:30']; c1=datenum(xxx, 'HH:MM'); c2=datenum(xxx2, 'HH:MM'); c3=datenum(xxx3, 'HH:MM'); a1 = subplot(3,1,1); plot(c,randn(10,1)); hold on; datetick('x','HH:MM') a2 = subplot(3,1,2); plot(a2,c2,randn(3,1)) a3 = subplot(3,1,3); plot(a3,c3,randn(4,1)) linkaxes([a1 a2 a3], 'x');
Tablice komórkowe xxx2=['17:30' ;'18:00'; '18:30']; x = {xxx, xxx2, xxx3} for i = 1:3 c = datenum(x{i}, 'HH:MM'); a = subplot(3,1,i); plot(c,randn(size(x{i},1),1)); hold on; datetick('x','HH:MM') end linkaxes([a1 a2 a3], 'x'); Nie stosować niepotrzebnie tablic komórkowych do obliczeń
Funkcje Przykłady function [out1,out2,out3]= mojafunkcja(in1,in2) Funkcja nic nie zwraca function [] = mojafunkcja(in1,in2) lub function mojafunkcja(in1,in2) Funkcja bez paramterów function mojafunkcja()
Funkcje Po co stosować funkcje? Separujemy zmienne – funkcja nic nie zmieni w sposób niekontrolowany w środowisku - funkcja „posprząta po sobie” Funkcje wykonują się szybciej Program ułożony z funkcji jest czytelniejszy i krótszy Umożliwia budowanie stopniowe dużych programów Kod w postaci funkcji może być stosowany dla innych zadań
Funkcje function plott(time,y) % plott(time,y) rysuje os x jako czas % format czasu HH : MM : SS % podaj wektor time w sekundach godziny=floor(time./3600); minuty = time./3600-godziny; czas = godziny+minuty; plot(czas,y); xt = get(gca,'XTick'); xt_godz = floor(xt); xt_min10=xt-xt_godz; xt_min=floor(60*xt_min10); xt_sec10 = 60*xt_min10-xt_min; xt_sec = floor(60*xt_sec10); podpisy = cell(1,length(xt_sec)); for k=1:length(xt_sec) tg = num2str(xt_godz(k)); if xt_godz(k)<10 tg = ['0' tg]; end tm = num2str(xt_min(k)); if xt_min(k)<10 tm = ['0' tm]; ts = num2str(xt_sec(k)); % tst = num2str(ts); if xt_sec(k)<10 ts = ['0' ts]; podpisy{1,k} = [tg ':' tm ':' ts]; set(gca,'XTickLabel',podpisy) % koniec funkcji
Funkcje function plott(time,y) % plott(time,y) rysuje os x jako czas % format czasu HH : MM : SS % podaj wektor time w sekundach godziny=floor(time./3600); minuty = time./3600-godziny; czas = godziny+minuty; plot(czas,y); xt = get(gca,'XTick'); xt_godz = floor(xt); xt_min10=xt-xt_godz; xt_min=floor(60*xt_min10); xt_sec10 = 60*xt_min10-xt_min; xt_sec = floor(60*xt_sec10); podpisy = cell(1,length(xt_sec)); for k=1:length(xt_sec) tg = num2str(xt_godz(k)); if xt_godz(k)<10 tg = ['0' tg]; end tm = num2str(xt_min(k)); if xt_min(k)<10 tm = ['0' tm]; ts = num2str(xt_sec(k)); % tst = num2str(ts); if xt_sec(k)<10 ts = ['0' ts]; podpisy{1,k} = [tg ':' tm ':' ts]; set(gca,'XTickLabel',podpisy)
Zadanie domowe – opisywanie osi czasu function plott(time,y) % plott(time,y) rysuje os x jako czas % format czasu HH : MM : SS % podaj wektor time w sekundach godziny=floor(time./3600); minuty = time./3600-godziny; czas = godziny+minuty; plot(czas,y); xt = get(gca,'XTick'); xt_godz = floor(xt); xt_min10=xt-xt_godz; xt_min=floor(60*xt_min10); xt_sec10 = 60*xt_min10-xt_min; xt_sec = floor(60*xt_sec10); podpisy = cell(1,length(xt_sec)); for k=1:length(xt_sec) tg = num2str(xt_godz(k)); if xt_godz(k)<10 ; tg = ['0' tg] ; end tm = num2str(xt_min(k)); if xt_min(k)<10 ; tm = ['0' tm] ; end ts = num2str(xt_sec(k)); if xt_sec(k)<10 ; ts = ['0' ts] ; end podpisy{1,k} = [tg ':' tm ':' ts]; end set(gca,'XTickLabel',podpisy)
Zadanie domowe
Zadanie domowe – opisywanie osi czasu xxx=['14:30';'15:00';'15:30';'16:00';'16:30';'17:00';'17:30';'18:00';'18:30';'19:00']; xxx2=['17:30' ;'18:00'; '18:30']; xxx3=['14:30';'15:00' ;'15:30'; '16:00'] x = {xxx, xxx2, xxx3} for i = 1:3 c = datenum(x{i}, 'HH:MM'); a = subplot(3,1,i); plot(c,randn(size(x{i},1),1)); hold on; datetick('x','HH:MM') end linkaxes([a1 a2 a3], 'x');
Zadanie domowe – opisywanie osi czasu
Zadanie domowe – opisywanie osi czasu
Zadanie domowe – opisywanie osi czasu ts1 = timeseries(A1, T1); ts1.Name = 'Amplitude'; ts1.TimeInfo.Units = 'seconds'; ts1.TimeInfo.StartDate='01-Jan-2013'; % start date. ts1.TimeInfo.Format = 'HH:MM:SS'; % format for display on x-axis. t_min = min ([T1(1) T2(1) T3(1)]) t_max = max ([T1(l1) T2(l2) T3(l3)]) x=(0.8*(T1(1)-t_min)/(t_max-t_min))+0.1; y=(0.8*(T1(l1)-t_min)/(t_max-t_min))+0.1; subplot ('Position', [x, .1, y-x, .27]) plot(T1,A1,'-.r*') title ('')
Zadanie domowe
Przykład do omówienia % Program do liczenia R, korzysta z wczesniej obliczonego CFF oraz gestosci % prawdopodobienstwa wystapienia wstrzasu, wykorzystuje rowniez stale % Mozna wczytac dajke Pink Green AS=0.01; %stala ta=6; %stala load('Y.mat');load('X.mat'); load('C.mat'); load('density.mat'); aft=load('aft_3380-3459.99.txt'); %wczytanie aftershockow y=aft(:,1); x=aft(:,2); cou=1; N=0; Rate=0;
Przykład do omówienia cou=1; N=0; Rate=0; for t=1:1:6 for m=1:32 for n=1:32 R(n,m)=dens(n,m)/((exp(-C(n,m)/AS)-1)*exp(-t/ta)+1); end N(cou)=sum(sum(R)); Rate=Rate+R; cou=cou+1;
Przykład do omówienia Yy=Y(1,:); Yy=Yy(:); Xx=X(:,1); for i=1:length(aft) % przyrownywanie wspolrzednych wstrzasow for j=1:(length(Yy)-1) % do odpowiednich oczek siatki Y if (y(i)>Yy(j) && y(i)<Yy(j+1) ) y(i)=Yy(j); else continue end
Regresja liniowa Jest Statistics Toolbox, który zawiera kilka możliwości liczenia regresji liniowej np.: mdl = LinearModel.fit(X,y) [r,m,b] = regression(t,y) beta = mvregress(X,Y) % Multivariate linear regression [b,bint,r,rint,stats] = regress(y,X) Można liczyć samemu w oparciu o algebrę macierzy
Regresja liniowa Y2 = B1(3:end) ; X2 = [ones(norigin,1) p.oml] ; varB1 = stats(4) * inv(X1' * X1) ; varP = varB1(3:end,3:end) ; plot(wyn(1:i)) ; I = eye(norigin) ; ee = 1 ; V2 = varP + I * ee ; B2 = (X2' * (V2 \ X2)) \ X2' * (V2 \ Y2) ; tm = (Y2 - X2*B2) ; sigma_2 = tm' * (V2 \ tm) / npha ; result.sigma = sqrt(sqr(stats(4)) + sigma_2) ; result.h = h ; result.a = zeros(4,1) ; result.a(1:2) = B2 ; result.a(3) = B1(1) ; Y = Y1 ; X = ones(npha,3) ; X(:,3) = X1(:,1) ; X(:,2) = [p.pha.ml]' ; B = result.a(1:3) ; tm = (Y - X*B) ; result.S2 = sqrt(tm' * tm / npha) ;
Regresja liniowa cftool
Warto zapamiętać Nie stosować C= inv(B) * A ; Lepiej się liczy – szybciej i dokładniej C = B \ A ;
Czytanie/pisanie danych save … -ascii -double -tabs load Czytanie/pisanie formatowane fopen fprintf, fwrite fscanf, fgetl, fgets, fread fclose Czytanie/pisanie operuje na wektorach. Nie ma potrzeby kontrolowania rozmiaru wczytywanych danych
Tablica struktur sta = 229x1 struct array with fields: sid sname slat slon selev
Tablica struktur >> disp(sta(1)) sid: 1 sname: 'GKP' slat: 53.2697 slon: 17.2367 selev: 115
Tablica struktur >> b = [sta.slat]'; >> disp(b(1:5)) 53.2697 77.0057 50.8428 49.6314 50.2195
Tablica struktur >> b = [[sta.slat]' [sta.slon]'] ; >> disp(b(1:5,:)) 53.2697 17.2367 77.0057 15.5301 50.8428 16.2931 49.6314 22.7075 50.2195 19.7984
Tablica struktur >> b = {sta.sname}' ; >> b{1:2} ans = GKP HSP
Tablica struktur >> b = {sta.sname}' ; >> b b = 'GKP' 'HSP' 'KSP‘
Programowanie Matlaba Koniec Dziękuję za uwagę i zainteresowanie