Wykład 4 Różne typy danych Zmienne złożone: typy cell i struct Łańcuchy znakowe Interpolacja i ekstrapolacja danych Dopasowywanie funkcji na podstawie punktów INNE TYPY DANYCH Struktura Struktury Struktury w Matlabie służą do przechowywania danych różnych typów i różnych wielkości w obrębie jednej macierzy. Jest to zbiór rekordów o tych samych polach. Przydatny zwłaszcza w bazach danych. Definiowanie struktury danych typu student: >> student().nazwisko = 'Abacki'; >> student().wiek = '20'; >> student().dane = rand(3); >> student(2).nazwisko = 'Babacki'; >> student(2).wiek = '22'; >> student(2).dane = randn(3); http://www.igf.fuw.edu.pl/zoi/matlab/lessons/matlabii/dzialy/d0m2.htm Definiowanie struktury przy wykorzystaniu funkcji struct Do definiowania danych zorganizowanych w strukturę wykorzystujemy funkcję struct. >> student = struct('nazwisko',{'abacki','babcki'},'wiek',{20,22},'dane',{rand(3), randn(3)}); Takie definiowanie struktury daje możliwość wcześniejszej alokacji pamięci co wpływa na szybkość wykonywania operacji: >> student = repmat(struct('nazwisko',{''},'wiek',{''},'dane',{''}),0,); % alokacja pamięci dla 0 studentów UWAGA: Funkcja repmat służy do powielania elementów. Wynik >> student = struct('nazwisko',{'abacki','babcki'},'wiek',{20,22},'dane',{rand(3), randn(3)}) student = x2 struct array with fields: nazwisko wiek dane >> student = repmat(struct('nazwisko',{''},'wiek',{''},'dane',{''}),0,) student = Wyświetlanie danych ze struktury Ze względu na fakt, że w pojedynczej strukturze mogą być zapisane elementy o różnym stopniu zagłębienia, do wyświetlania poszczególnych danych wykorzystuje się różną składnię. >> student % Nazwa struktury. Wyświetlenie nazw pól >> student() % Wyświetlenie wszystkich pól (danych) dla danego rekordu >> student(2).wiek % Wyświetlenie pola (konkretnej danej) 0x struct array with fields: nazwisko wiek dane >> student.nazwisko Abacki Babcki >> student().nazwisko Abacki >> student() nazwisko: 'Abacki' wiek: 20 dane: [3x3 double]
Macierz komórek - cell array Główna różnica między strukturą a macierzą komórek jest fakt, że w macierzy komórek odwołujemy się do poszczególnych elementów za pomocą adresu a nie za pomocą nazwy elementu. Macierz komórek jest macierzą, gdzie każdy element może być inną macierzą, zmienną lub strukturą, a także inną macierzą komórkową, obiektem Javy. Wyświetlanie danych z macierzy komórek Wyświetlanie danych z macierzy komórek jest podobne jak przy wyświetlaniu elementów zwykłej macierzy z tą różnicą, że teraz korzystamy z nawiasów { }. >> a{,} % Wyświetlenie pojedynczego elementu >> a{2,:} % Wyświetlenie kolumny elementów >> celldisp(a) % Wyświetlenie całości danych >> cellplot(a) % Graficzne przedstawienie danych >> a = {:, pi; rand(3), 'tekst'} a = [x double] [3.46] [3x3 double] 'tekst' >> a{,} 2 3 4 >> a{2,:} 0.243 0.966 0.4733 0.9293 0.2 0.37 0.300 0.660 0.8308 >> a = {:, pi; rand(3), 'tekst'} a = [x double] [3.46] [3x3 double] 'tekst' >> cellplot(a) 3.46 UWAGA: Jeżeli zmienna A była raz użyta jako cell to nie wystarczy później podstawić jako zwykłą macierz aby usunąć pamięć o typie cell, clear A jest konieczne. tekst Dostęp do elementów w komórce Stosujemy nawiasy klamrowe >> A{,2} [3x3 double] 'Test ' [x2 double] {x2 cell} >> A{,2}{,} 2 8 7 3 0 6 7 3 Pełne wyświetlenie zawartości komórki, celldisp >> celldisp(a) A{} = 7 24 8 23 7 4 6 4 6 3 20 22 0 2 9 2 3 8 2 2 9 A{2}{,} = 2 8 7 3 0 6 7 3 A{2}{2,} = 2.0000-4.0000i.0000 + 7.0000i A{2}{,2} = Test A{2}{2,2}{} = 7 A{2}{2,2}{2} = [] Konwersja typów między strukturą lub macierzą zwykłą a macierzą komórek struct2cell cell2struct cell2mat mat2cell zamiana struktury na macierz komórek zamiana macierzy komórek na strukturę zamiana macierzy na macierz komórek zamiana macierzy komórek na macierz >> a = {:, pi; :0, 4*3}; % Zdefiniowanie macierzy komórek >> pola = {'wektor','liczba'}; % zdefiniowanie nazwy pól >> cell2struct(a,pola,2); % Zamiana macierzy komórek na strukturę 2
cell2struct >> dane = {'Ania','Kowalska',6; 'Ewa','Kwiatkowska',70} każdy element to komórka dane = 'Ania' 'Kowalska' [6] 'Ewa' 'Kwiatkowska' [70] >> pola = {'imie', 'nazwisko', 'wzrost'} pola = 'imie' 'nazwisko' 'wzrost' >> s = cell2struct(dane, pola, 2) s = 2x struct array with fields: imie nazwisko wzrost >> s() imie: 'Ania' nazwisko: 'Kowalska' wzrost: 6 >> s(2).nazwisko Kwiatkowska Typ sparse (rzadki) Typ sparse (rzadki) >> A=round(rand(,4)) 0 0 0 0 0 0 0 0 0 0 >> S=sparse(A) S = (3,) (,) (,2) (3,2) (4,2) (,2) (,3) (2,4) (3,4) (,4) >> spy(s) Funkcje obsługujące typ rzadki tf = issparse(s) czy jest? S = sparse(a) full(s) konwersja na pełny S = sparse(m,n) A=spy(S) jaki wzór Przykład : S = sparse(:0,:0,) S = (,) (2,2) (3,3) (4,4) (,) (6,6) (7,7) (8,8) (9,9) (0,0) >> S(,2) 0 >> S(,) OSZCZĘDNOŚĆ PAMIĘCI whos Name Size Bytes Class M_full 00x00 9680000 double array M_sparse 00x00 4404 sparse array Grand total is 20000 elements using 9684404 bytes 3
Łańcuchy znakowe A='to jest napis' to jest napis Łańcuchy Porównywanie łańcuchów k = strcmp('str','str2') TF = strcmp(s,t) Przykłady: strcmp('yes','no') 0 strcmp('yes','yes') Konwersja na łańcuch mat2str - zamiana macierzy w łańcuch. Przydatne w poleceniu eval str = mat2str(a) str = mat2str(a,precyzja), precyzja ilość cyfr po przecinku num2str zamiana liczby na string str = num2str(a) str = num2str(a,precision) str = num2str(a,format) int2str title(['temperatura ', int2str(t)]) str2mat(a) Konwersja z łańcucha char(t,t2,t3) zamiana łańcuchów na macierz, uzupełnienie spacjami do właściwego wymiaru. W przypadku standardowych łańcuchów działa tak samo jak str2mat. Działa też dla typu cell >> T='to jest napis'; >> T2='to jest inny napis'; >> T3='Ten tez'; >> char(t,t2,t3) to jest napis to jest inny napis Ten tez >> cc={'text','napis_jakis','napis_inny'} cc = 'text' 'napis_jakis' 'napis_inny' >> conv=char(cc) conv = text napis_jakis napis_inny >> conv(2,4) i lower - Duże na małe litery upper (odwrotnie) strtok Pierwszy znak w łańcuchu Przykład s = ' To jest przykład.'; [token,rem] = strtok(s) token = To jes rem = t przykład 4
strrep Znalezienie i zamiana łańcucha str = strrep(str,str2,str3). s = 'To jest dobry przykład.'; str = strrep(s, dobry', zły') str =To jest zły przykład. findstr Znajdowanie łańcucha w łańcuchu k = findstr(str,str2) str = 'Find the starting indices of the shorter string.'; findstr(str,str2) 6 30 str2 = 'the'; eval Uruchomienie łańcucha z wyrażeniem Matlaba [a,a2,a3,...] = eval( moja_funkcja(b,b2,b3,...) ) eval('[a,a2,a3,...] = moja_funkcja(var)') % NIE POLECANE Przykład >> A='[ 2 3]' [ 2 3] >> A=str2mat(A) [ 2 3] >> A() >> A=eval( 2*3 ) FUNKCJE PRZETWARZAJĄCE ŁAŃCUCHY 6 feval feval('sin',pi/2) feval(@sin,pi/2) H= @sin uchwyt do funkcji sinus fplot fplot('tanh',[x0 x_kon]) deblank(s) findstr(s,s2) lower(s) / upper(s) strcat(s,s2,...) strcmp(s,s2) usuwa spacje z końca łańcucha; szuka krótszego z łańcuchów s i s2 w dłuższym; zwraca wektor indeksów, od których zaczyna się występowanie krótszego łańcucha; zmienia wszystkie litery w łańcuchu na małe / duże; łączy łańcuchy w poziomie z pominięciem spacji na końcu każdego z nich; porównuje dwa łańcuchy; jeśli są identyczne, zwraca, jeśli nie-0; funkcja rozróżnia wielkość liter; strcmpi(s,s2) strncmp(s,s2,n) strvcat(s,s2,s3) upper(s) porównuje dwa łańcuchy bez rozróżniania wielkości liter; porównuje n pierwszych znaków w dwu łańcuchach; łączy łańcuchy w pionie, dodając na końcu każdego z nich odpowiednią liczbę spacji; zwraca macierz znakową; zmienia wszystkie litery w łańcuchu na duże; FUNKCJE KONWERTUJĄCE ŁAŃCUCHY int2str(n) num2str(x) str2double(s) konwertuje liczbę całkowitą n na łańcuch (liczba niecałkowita przed konwersją zostanie zaokrąglona); argumentem funkcji może być macierz; konwertuje wyrażenie MATLAB-a (liczbę, macierz lub polecenie) na łańcuch; konwertuje łańcuch s na liczbę (rzeczywistą lub zespoloną); liczba w łańcuchu musi mieć prawidłowy format;
0.8 0.6 0.4 0.2 0-0.2-0.4-0.6-0.8 Interpolacja interp interp interpolacja jednowymiarowa yi = interp(x,y,xi) yi = interp(x,y,xi,method) yi = interp(x,y,xi,method,'extrap') x wektor argumentów (o znanych wartościach) Y- wektor wartosci dla x x i wektor wartości do interpolacji Metody 'nearest' metoda najbliższego sąsiada 'linear' liniowa, domyślna 'spline'- krzywa sześcienna składana 'pchip', 'cubic' (to samo) sześcienna, zachowująca monotoniczność i kształt danych 'vcubic' -Cubic interpolation używany w MATLAB Przykłady Interpolacja niedokładnej sinusoidy x=0:0; y=sin(x); xi=0:0.2:0; yi=interp(x,y,xi); plot(x,y,'o',xi,yi) - 0 2 3 4 6 7 8 9 0 Spline %interp_metoda x=0:0; y=sin(x); xi=0:0.2:0; yi=interp(x,y,xi,'linear'); yi2=interp(x,y,xi,'spline'); yi3=interp(x,y,xi,'cubic'); yi4=interp(x,y,xi,'nearest'); plot(x,y,'o',xi,yi,'-', xi,yi2,':',xi,yi3,'-.',xi,yi4,'--') legend('punkty','liniowa','spline','cubic','nearest') Interpolacja wielomianem wysokiego rzędu często błędne wyniki (szczególnie poza przedziałem danych). Metoda cubic spline każda para punktów ('końcowe') inny wielomian 3 s-nia. Nieskończona ilość krzywych więc tak, aby I i II pochodna się zgadzała w punktach końcowych. Nachylenie i krzywizna wielomianów musi być ciągła w tych punktach. Dla n punktów rozwiązywanych jest 4(n-) równań. Jeżeli obliczenia wielokrotnie, ale dla różnych danych x, spline bez ostatniego argumentu xi (spline oblicza formę pp), którą można wywoływać wielokrotnie. Wykorzystanie f-cji ppval. Funkcja 'spline' b. dobra, gdy dane źródłowe są z natury dosyć gładkie. W przeciwnym razie czestym błędem jest generowanie nieistniejących maks. i min. Funkcja pchip mniej dokładna dla danych gładkich, ale mniej oscylacyjna 6
Przykład spline interp(...'spline') można zastąpić spline Przykład interp_spline.m: x=0:0; y=sin(x); pp=spline(x,y) xi=0.:0.:0; yi=ppval(pp,xi) plot(x,y,'o',xi,yi) Przykład interp_pchip.m x=[0 2 4 7. 0]; y=exp(-x/6).*cos(x); cs=spline(x,y); %cubic spline ch=pchip(x,y) %cubic Hermite xi=linspace(0,0); ysi=ppval(cs,xi) %spline yci=ppval(ch,xi) %cubic plot(x,y,'o',xi,ysi,':',xi,yci); legend('dane','spline','cubic') Interpolacja dwuwymiarowa interp2 ZI = interp2(x,y,z,xi,yi) ZI = interp2(z,xi,yi) ZI = interp2(z,ntimes) ZI = interp2(x,y,z,xi,yi,method) Przykład [X,Y] = meshgrid(-3:.2:3); Z = X.^2+Y.^2; [XI,YI] = meshgrid(-3:.2:3); ZI = interp2(x,y,z,xi,yi); figure mesh(x,y,z), hold, mesh(xi,yi,zi+) hold off axis([-3 3-3 3-20]) Uwaga: Jeżeli punkty nie pojawiaja się na siatce geometrycznej w regularny sposób wówczas interpolację przeprowadza się w oparciu o funkcję dalaunay, tsearch, dsearch Metody interpolacji 3D [x,y] = meshgrid(-3::3); z = peaks(x,y); surf(x,y,z) [xi,yi] = meshgrid(-3:0.2:3); zi = interp2(x,y,z,xi,yi,'nearest'); 'nearest' metoda najbliższego sąsiada bilinear' liniowa, domyślna bicubic sześcienna, zachowująca monotoniczność i kształt danych 7
Dopasowywanie krzywej wielomianem (ang. fit) Przykład fitowanie.m Przykład Metoda najmniejszych kwadratów. Wybieramy stopień wielomianu n. Jeżeli n= regresja liniowa. polyfit p=polyfit(x,y,n) p-wsp. wielomianu od najwyższej potęgi n-stopień wielomianu x=[0:0.:]; y=[-.0447,.978, 3.28, 6.6, 7.08,... 7.34, 7.66, 9.6, 9.48, 9.3,.2]; n=2; p=polyfit(x,y,n) p = -9.07 9.243 0.208 Czyli: y(x)=-9.07 x 2 +9.243 x+ 0.208 polyval Narzędzia z menu okna - dopasowanie Za pomocą funkcji polyval (oblicza wartość wielomianu o współczynnikach p uzyskanych z funkcji polyfit) xi=x; yi=polyval(p,xi) plot(x,y,'o',xi,yi,':') Dopasowywanie krzywą dowolnego typu Funkcja fit.m (CurveFitting Toolbox) dopasowanie danych krzywą sigmoidalną stopnia: y( x) x a x + b = 2.8.6.4.2 0.8 0.6 krzywa sigmoidalna 0.4.2.4.6.8 2 2.2 2.4 2.6 2.8 3 % proba_fit.m E=[::0]'; Y=[. 2 4 6 6 6. 6.2 6.2]'; plot(e,y,'ko-','linewidth',2); hold on %fitowanie sigmoidalne opts = fitoptions('method','nonlinear','normalize','off'); ftype = fittype('a*x.^./(x.^+b)','options',opts) f2 = fit(e,y,ftype) % [fit,gof,out]=fit(e,y,'poly2') a=f2.a; b=f2.b; Y2=a*E.^./(E.^+b); plot(e,y2,'k--','linewidth',2); hold off >> proba_fit ftype = General model: ftype(a,b,x) = a*x.^./(x.^+b) Warning: Start point not provided, choosing random start point. f2 = General model: f2(x) = a*x.^./(x.^+b) Coefficients (with 9% confidence bounds): a = 6.492 (.69, 7.29) b = 630 (474.6, 2786) 8
y( x) x a x + b = cftool (CurveFitting Toolbox) 2 krzywa sigmoidalna.8.6.4.2 0.8 0.6 0.4.2.4.6.8 2 2.2 2.4 2.6 2.8 3 Wykład Analiza dźwięku (i nie tylko) Audiorecorder 9