Download - Użytkowanie i programowanie Matlaba
Użytkowanie i programowanie Matlaba
Współpraca z programami w C
Uwarunkowanie zadania
Uwarunkowanie zadania to czułość na zaburzenie danych. Jeżeli zadanie jest źle uwarunkowane, to niewielka zmiana danych może spowodować dużą relatywną zmianę wyniku. Wskaźnik uwarunkowania zadania charakteryzuje wpływ zaburzeń danych na zaburzenie rozwiązania, np. wskaźnik uwarunkowania zadania dla funkcji f(x) wynosi |xf'(x)/f(x)|
Algorytm numerycznie poprawny
Algorytm numerycznie poprawny to algorytm, który daje rozwiązanie będące nieco zaburzonym dokładnym rozwiązaniem zadania o nieco zaburzonych danych. "Nieco zaburzone" oznacza zaburzone na poziomie reprezentacji zmiennoprzecinkowej.
Algorytm numerycznie stabilny
Algorytm stabilny numerycznie to taki, który nie dopuszcza do sytuacji, kiedy w wyniku kumulacji poszczególnych błędów możemy uzyskać wysoce przekłamany wynik.
Algorytm numerycznie stabilny
Przykład pierwiastki równania kwadratowego x2-2px+q :Zamiastx1 = p+sqrt(p2-q) ; x2 = p-sqrt(p2-q)należy liczyćif p >=0
x1 = p+sqrt(p2-q) ;x2 = q/x1 ;
elsex2 = p-sqrt(p2-q) ;x1 = q/x1 ;
end
Obliczenia równoległe
• Obliczenia na wielu rdzeniach/procesorach komputera
• Obliczenia na klastrze• Obliczenia na karcie graficznej
Warto zastosować
• Włączenie obliczeń równoległychmatlabpool open• Wiele funkcji w Matlabie ma wbudowane
wsparcie dla obliczeń równoległych i rozproszonych
• Na koniecmatlabpool close
Podstawowe operatory dla obliczeń równoległych
- parfor- batch- spmd- pmode
Zaawansowany poziom wykorzystania obliczeń równoległych
• Przydzielanie klastrów obliczeniowych• Definiowanie zadań job, ich
wykonywanie i kontrola• Definiowanie wątków task
MATLAB Distributed Computing Server
Pętla parforclear Afor i = 1:8 A(i) = i;endA
Działanie:• Zakres zmienności zmiennej sterującej dzielony pomiędzy workerów• Dane konieczne dla poszczególnych iteracji są rozsyłane do workerów• Każdy worker wykonuje swoją pulę iteracji• Wyniki są zwracane do klienta
clear Aparfor i = 1:8 A(i) = i;endA
Rodzaje zmiennych w pętli parfor
Loop variables Sliced variables Broadcast variablesReduction variablesTemporary variables
Loop variables
parfor i = 1:n i = i + 1; a(i) = i;end
Sliced Variablesparfor i = 1:length(A) B(i) = f(A(i));end
Praca domowaparfor i = 1:kB(:) = h(A(i),A(i+1));end
• Co napisać, aby można było w wykonywać tą czynność w pętli
Praca domowaC(1:k) = A(2:k+1);parfor i = 1:kB(:) = h(A(i),C(i));end
Sliced VariablesA(i+f(k),j,:,3)A(i,20:30,end)A(i,:,s.field1)
• Prawidłowe i nieprawidłowe indeksowanie
A(i+k,j,:,3)A(i,:,end)A(i,:,k)
Broadcast Variables
Jest rozsyłany do wszystkich wątków
Reduction Variablesx = 0;parfor i = 1:10 x = x + i;endx
x2 = [];n = 10;parfor i = 1:n x2 = [x2, i];endx2
Akumulują wartości po wszystkich pętlach
SPMD -tablice rozproszoneTablice podzielone pomiędzy zasoby pamięciowe labów
Ze strony klienta – DistributedArray
matlabpool open local 2 W = ones(6,6); W = distributed(W); spmd T = W*2; end matlabpool close
Ze strony labu – CodistributedArray
matlabpool open local 2 spmd codist = codistributor1d(3, [4, 12]); Z = codistributed.zeros(3, 3, 16, codist); Z = Z + labindex; end matlabpool close
pmode
GPU
Rg = gpuArray.rand(1,4)
G = gpuArray(ones(100, 'uint32'));D = gather(G);
X = rand(1000);G = gpuArray(single(X));
result = arrayfun(@myFunction, arg1, arg2);
gpuDeviceCountgpuDevice(2)
Współpraca Matlaba z innymi programami
• Matlab plik Program• Program plik (ASCII, EXEL) Matlab• Matlab plik MAT Program
• Matlab plik Program plik Matlab• Matlab funkcja (C/C++, Fortran)• Program (C/C++, Fortran) Matlab
Matlab plik Pogram plik MatlabFunkcje użyteczne
save … -ascii -double -tabsload
fopenfprintf, fwrite fscanf, fgetl, fgets, freadfclose
Matlab plik program plik Matlab
• Przykład m-pliku z funkcją interfejsu do zewnętrznego programu „topar.m”
Matlab plik program plik Matlab
• Przykład m-pliku z funkcją interfejsu do zewnętrznego programu „topar.m”
Współpraca Matlaba z innymi programami
• Matlab plik Program• Program plik (ASCII, EXEL) Matlab• Matlab plik MAT Program (C/C++, Fortran)
• Matlab plik Program plik Matlab• Matlab funkcja (C/C++, Fortran)• Program (C/C++, Fortran) Matlab
Rodzaje funkcji bibliotecznych
• mx* – operacje na typach Matlaba• mex* – komunikacja ze środowiskiem Matlaba• eng* – korzystanie z mechanizmów Matlaba• mat* – operacje na plikach z danymi Matlaba
Operowanie na plikach MAT
• Biblioteka mat* do czytania i pisania do pliku tablic Matlabowskich
• Biblioteka mx* do operacji na tablicach Matlabowskich
Eksploatacja mechanizmu Matlaba z programu
• Biblioteka mx* do operacji na tablicach/strukturach Matlabowskich
• Bibloteka eng* do otwarcia „silnika” Matlaba, exportu i importu danych oraz wykonywania polecen w Matlabie
Dodawanie kodu w C i Fortranie – tworzenie MEX-funkcji
• Standardowa nazwa funkcji• Biblioteka mx* do operacji na tablicach
Matlabowskich• Biblioteka mex* do komunikacji ze
środowiskiem Matlaba
Standardowa funkcja MEX w C
void mexFunction(int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[]){/* program ... */}
Standardowa funkcja MEX w Fortranie
subroutine mexFunction(nlhs, plhs, nrhs, prhs)integer nlhs, nrhsinteger plhs(*), prhs(*)
C programC ...
Przykłady biblioteki mx*
• mxMalloc, mxFree – przydzielanie i zwalnianie pamięci na zmienne (w C )
• Typy danych/struktury Matlaba, np. mxArray• mxCreateDoubleMatrix, mxCreateDoubleScalar –
tworzenie tablicy Matlaba• mxDestroyArray – usuwanie tablicy Matlaba• mxGetM, mxGetN – określanie rozmiarów tablic• mxIsClass, mxIsDouble, itd. – badanie typu danych• mxGetPr, mxGetPi, mxGetScalar – dostęp do danych
double
Przykład mex funkcji#include <math.h>#include "mex.h"void mexFunction(int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[]){ double *x, *y ; double sqsum ; int i, m, n, N ; if(nrhs != 1) { mexErrMsgTxt("SQCUM: Only one input argument allowed.") ; } if(nlhs != 1) { mexErrMsgTxt("SQCUM: Only one output argument allowed.") ; } m = mxGetM(prhs[0]) ; n = mxGetN(prhs[0]) ; if(((m > 1) && (n > 1)) || !mxIsDouble(prhs[0])) { mexErrMsgTxt("TRGtest: Only one dimension input vector allowed.") ; } N = m*n ; x = mxGetPr(prhs[0]); plhs[0] = mxCreateDoubleMatrix(1,N,mxREAL) ; y = mxGetPr(plhs[0],y) ; sqsum = x[0] ; y[0] = x[0] ; for(i = 1 ; i < N ; i++) { sqsum = sqsum - x[i]*(sqsum > 0 ? 1 : -1) ; y[i] = sqsum ; }}
Przykłady biblioteki mex* • mexEvalString, mexCallMatlab – wykonywanie
polecenia i funkcji z matlaba• mexWarnMsgTxt, mexErrMsgTxt, mexPrintf –
wypisywanie komunikatów w Matlabie• mexLock – zatrzymanie MEX pliku w pamięci• mexSet – ustawienie właściwości np. grafiki• mexIsGlobal – badanie czy istnieje dana zmienna
globalna• mexFunctionName – odczytanie nazwy bieżącej
funkcji
Kompilacja MEX funkcji
• Można stosować własny kompilator powszechny kompilator, np. Visual C++, Borland C, Watkom
• Matlab posiada własny kompilator. Wywoływany poleceniemmex <options> <filenames>np.mex funkcja.cmex procedura.F funkcje.F
Współpraca Matlaba z innymi programami
• Matlab plik Program• Program plik (ASCII, EXEL) Matlab• Matlab plik MAT Program (C/C++, Fortran)
• Matlab plik Program plik Matlab• Matlab funkcja (C/C++, Fortran)• Program (C/C++, Fortran) Matlab
Funkcje biblioteki eng*
engOpen, engClose – otwarcie i zamknięcie „silnika” Matlaba Engine – Uchwyt do MatlabaengPutVariable – export zmiennej do MatlabaengGetVariable – import tablicy z MatlabaengEvalString – wykonanie polecenia w MatlabieengOutputBuffer – ustalenie bufora na komunikaty z Matlaba
Dokumentacja
• MATLAB External Interfaces „apiext.pdf” (Application Program Interface Guide)
MATLAB External Interfaces Reference „apiref.pdf”
• MATLAB Compiler• MATLAB COM Builder• MATLAB Excel Builder
Przykład z bibliotek programu rotan
// date mxArray *id = mxCreateDoubleMatrix(ln,1,mxREAL) ; double* ptr = mxGetPr(id) ; for(long j = 0 ; j < ln ; j++) { ptr[j] = larr[j] ; } delete[] larr ; name = "id" + IntToStr(cnt) ; mxSetName(id,name.c_str()) ; engPutArray(engine,id) ; mxDestroyArray(id) ;
Przykład z bibliotek programu rotan
// sta name mxArray *ista = mxCreateString(chp.name().getsta().c_str()) ; name = "ista" + IntToStr(cnt) ; mxSetName(ista,name.c_str()) ; engPutArray(engine,ista) ; mxDestroyArray(ista) ;
Przykład z bibliotek programu rotan
// chan number mxArray *inumber = mxCreateScalarDouble(chp.name().getnumber()) ; name = "inumber" + IntToStr(cnt) ; mxSetName(inumber,name.c_str()) ; engPutArray(engine,inumber) ; mxDestroyArray(inumber) ;
Przykład z bibliotek programu rotan
// sta name mxArray *ista = mxCreateString(chp.name().getsta().c_str()) ; name = "ista" + IntToStr(cnt) ; mxSetName(ista,name.c_str()) ; engPutArray(engine,ista) ; mxDestroyArray(ista) ;
Przykład z bibliotek programu rotan
//data WxSHString name = "od"+IntToStr(cnt); mxArray *id = engGetArray(engine,name.c_str()) ; if(id == NULL) return ; double* ptr = mxGetPr(id) ; long ln = mxGetN(id)*mxGetM(id) ; WxSAMPLE *larr = new WxSAMPLE[ln]; double max = 0 ; for(long j = 0 ; j < ln ; j++) { if(max < fabs(ptr[j])) max = fabs(ptr[j]) ; } double scale = 16777216 / max; for(long j = 0 ; j < ln ; j++) { larr[j] = ptr[j] * scale ; } mxDestroyArray(id) ;
Przykład z bibliotek programu rotan
WxSHString mord = "v" + IntToStr(valindex) + "=" + ival ; engEvalString(l_engine,mord.c_str()) ;
Przykład z bibliotek programu rotan
char strcommand[256] ; sprintf(strcommand,"idata = struct('d',[],'b',0,'e',0,'sta',[],'name',[],'number',[])") ; engEvalString(l_engine,strcommand) ; sprintf(strcommand,"idata.d = id%d;",cnt) ; engEvalString(l_engine,strcommand) ; sprintf(strcommand,"idata.b = ib%d;",cnt) ; engEvalString(l_engine,strcommand) ; sprintf(strcommand,"idata.e = ie%d;",cnt) ; engEvalString(l_engine,strcommand) ; sprintf(strcommand,"idata.sta = ista%d;",cnt) ; engEvalString(l_engine,strcommand) ; sprintf(strcommand,"idata.name = iname%d;",cnt) ; engEvalString(l_engine,strcommand) ; sprintf(strcommand,"idata.number = inumber%d;",cnt) ; engEvalString(l_engine,strcommand) ; sprintf(strcommand,"icelldata{%d} = idata;",cnt) ; engEvalString(l_engine,strcommand) ;
Przykład z bibliotek programu rotanvoid __fastcall TRotanForm::Open2Click(TObject *Sender){ l_engine = engOpen(NULL) ; if(l_engine == NULL) { LogMessage("Can't start MATLAB engine") ; } else { MatlabImage->Visible = true ; Matlab1->Enabled = true ; }}//---------------------------------------------------------------------------void __fastcall TRotanForm::Close1Click(TObject *Sender){ if(l_engine) { engClose(l_engine) ; l_engine = NULL ; MatlabImage->Visible = false ; Matlab1->Enabled = false ; }}
Kompilatory Matlaba
• samodzielnych programów niezależnych od Matlaba (nie wymagających licencji)
• bibliotek dynamicznych dla innych programów• kodów źródłowych w C dla MEX plików• kodów źródłowych w C i C++ dla samodzielnych programów• kodów w C z S-funkcjami dla Simulinka• wtyczek do EXEL-a• obiektów COM
Kompilacja M-plików i tworzenie:
Dziękuję
Zadania do domu
Użytkowanie i programowanie Matlaba
Toolboxes
Signal processing
Analiza filtrów analogowych i cyfrowychTworzenie filtrów FIR i IIRAnaliza spektralna i cepstralna Analiza sygnałów statystycznych – widma mocy sygnałuPredykcja liniowaGeneracja fal
Signal processing – narzędzia GIU
Opracowanie i analiza filtrów Opracowanie i analiza okienkowaniaDrukowanie i analiza sygnałów czasowych Analiza spektralna i filtracja sygnału
System Identification
Tworzenie modelu matematycznego obiektu na podstawie sygnału wejściowego i wyjściowegoBadanie poprawności modeluBadanie wpływu szumu na pomiarObiekty liniowe i nieliniowe
Optimization
Minimalizacja skalaraMinimalizacja funkcji z ograniczeniami i bez ograniczeńProgramowanie liniowe i kwadratoweOptymalizacja wielokryterialnaNumeryczne rozwiązywanie równań liniowych i nieliniowychMetody najmniejszych kwadratów (dopasowywanie krzywych)
Inne narzędzia
Komercyjne- dostarczane przez MathWorks- dostarczane przez innych producentówDarmowe- dostarczane przez MathWorks (np. MatSeis)- z innych źródełWłasna twórczość
Dostępne narzędzia>> ver------------------------------------------------------------------------------------------------MATLAB Version: 8.0.0.783 (R2012b)MATLAB License Number: 321512Operating System: Microsoft Windows XP Version 5.1 (Build 2600: Dodatek Service Pack 2)Java Version: Java 1.6.0_17-b04 with Sun Microsystems Inc. Java HotSpot(TM) Client VM mixed mode------------------------------------------------------------------------------------------------MATLAB Version 8.0 (R2012b)Simulink Version 8.0 (R2012b)Curve Fitting Toolbox Version 3.3 (R2012b)Database Toolbox Version 4.0 (R2012b)Image Processing Toolbox Version 8.1 (R2012b)MATLAB Compiler Version 4.18 (R2012b)Neural Network Toolbox Version 8.0 (R2012b)Optimization Toolbox Version 6.2.1 (R2012b)Parallel Computing Toolbox Version 6.1 (R2012b)Partial Differential Equation Toolbox Version 1.1 (R2012b)Signal Processing Toolbox Version 6.18 (R2012b)Statistics Toolbox Version 8.1 (R2012b)Symbolic Math Toolbox Version 5.9 (R2012b)System Identification Toolbox Version 8.1 (R2012b)Wavelet Toolbox Version 4.10 (R2012b)