Programowanie Matlaba
description
Transcript of Programowanie Matlaba
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/macierzyIndeksowanie tablic wykonuje się wyrażeniem w postaciA(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 endpierwszy_wiersz = A(1,1:end)Symbol end może być stosowany w indeksowaniu odwrotnympierwsza_kolumna = A(end:-1:1,1)% Samodzielny znak dwukropka pierwszy_wiersz = A(1,:)Tablicę można indeksować jednym indeksemTablicę można indeksować tablicą logiczną
Tablice komórkoweCell 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órkowexxx=['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órkowexxx=['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')endlinkaxes([a1 a2 a3], 'x');
Nie stosować niepotrzebnie tablic komórkowych do obliczeń
FunkcjePrzykł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()
FunkcjePo 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ń
Funkcjefunction plott(time,y)% plott(time,y) rysuje os x jako czas% format czasu HH : MM : SS% podaj wektor time w sekundachgodziny=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]; endset(gca,'XTickLabel',podpisy)
% koniec funkcji
Funkcjefunction plott(time,y)% plott(time,y) rysuje os x jako czas% format czasu HH : MM : SS% podaj wektor time w sekundachgodziny=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]; endset(gca,'XTickLabel',podpisy)
end
Zadanie domowe – opisywanie osi czasufunction 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]; endset(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')endlinkaxes([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 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 liniowaY2 = 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 liniowacftool
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 -tabsloadCzytanie/pisanie formatowane fopenfprintf, fwrite fscanf, fgetl, fgets, freadfcloseCzytanie/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}' ;>> bb = 'GKP' 'HSP' 'KSP‘
Programowanie Matlaba
Koniec
Dziękuję za uwagęi zainteresowanie