330 likes | 513 Views
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.
E N D
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 • 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'] • 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)) • hold on; • datetick('x','HH:MM') • a3 = subplot(3,1,3); • plot(a3,c3,randn(4,1)) • hold on; • datetick('x','HH:MM') • linkaxes([a1 a2 a3], 'x');
Tablice komórkowe • 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'); • 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]; • end • ts = num2str(xt_sec(k)); • % tst = num2str(ts); • if xt_sec(k)<10 • ts = ['0' ts]; • end • podpisy{1,k} = [tg ':' tm ':' ts]; • end • 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]; • end • ts = num2str(xt_sec(k)); • % tst = num2str(ts); • if xt_sec(k)<10 • ts = ['0' ts]; • end • podpisy{1,k} = [tg ':' tm ':' ts]; • end • set(gca,'XTickLabel',podpisy) • end
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 – 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 • 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 ('')
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 • end • N(cou)=sum(sum(R)); • Rate=Rate+R; • cou=cou+1; • end
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 • end • 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 • ans = • HSP
Tablica struktur • >> b = {sta.sname}' ; • >> b • b = • 'GKP' • 'HSP' • 'KSP‘ •
Programowanie MatlabaKoniecDziękuję za uwagęi zainteresowanie