1 / 56

Użytkowanie i programowanie Matlaba

Współpraca z programami w C. Użytkowanie i programowanie Matlaba. Uwarunkowanie zadania.

topper
Download Presentation

Użytkowanie i programowanie Matlaba

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Współpraca z programami w C Użytkowanie i programowanie Matlaba

  2. 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 |xf'(x)/f(x)|

  3. 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.

  4. 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.

  5. Algorytm numerycznie stabilny Przykład pierwiastki równania kwadratowego x2-2px+q : Zamiast x1 = p+sqrt(p2-q) ; x2 = p-sqrt(p2-q) należy liczyć if p >=0 x1 = p+sqrt(p2-q) ; x2 = q/x1 ; else x2 = p-sqrt(p2-q) ; x1 = q/x1 ; end

  6. Obliczenia równoległe • Obliczenia na wielu rdzeniach/procesorach komputera • Obliczenia na klastrze • Obliczenia na karcie graficznej

  7. Warto zastosować • Włączenie obliczeń równoległych matlabpool open • Wiele funkcji w Matlabie ma wbudowane wsparcie dla obliczeń równoległych i rozproszonych • Na koniec matlabpool close

  8. Podstawowe operatory dla obliczeń równoległych - parfor - batch - spmd - pmode

  9. 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

  10. Pętla parfor clear A parfor i = 1:8 A(i) = i; end A clear A for i = 1:8 A(i) = i; end A 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

  11. Rodzaje zmiennych w pętli parfor Loop variables Sliced variables Broadcast variables Reduction variables Temporary variables

  12. Loop variables parfor i = 1:n i = i + 1; a(i) = i; end

  13. Sliced Variables parfor i = 1:length(A) B(i) = f(A(i)); end

  14. Praca domowa parfor i = 1:k B(:) = h(A(i),A(i+1)); end • Co napisać, aby można było w wykonywać tą czynność w pętli

  15. Praca domowa C(1:k) = A(2:k+1); parfor i = 1:k B(:) = h(A(i),C(i)); end

  16. Sliced Variables A(i+k,j,:,3) A(i,:,end) A(i,:,k) A(i+f(k),j,:,3) A(i,20:30,end) A(i,:,s.field1) • Prawidłowe i nieprawidłowe indeksowanie

  17. Broadcast Variables Jest rozsyłany do wszystkich wątków

  18. Reduction Variables x2 = []; n = 10; parfor i = 1:n x2 = [x2, i]; end x2 x = 0; parfor i = 1:10 x = x + i; end x Akumulują wartości po wszystkich pętlach

  19. SPMD -tablice rozproszone Tablice 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

  20. pmode

  21. 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); gpuDeviceCount gpuDevice(2)

  22. 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

  23. Matlab plik Pogram plik MatlabFunkcje użyteczne save … -ascii -double -tabs load fopen fprintf, fwrite fscanf, fgetl, fgets, fread fclose

  24. Matlab plik program plik Matlab • Przykład m-pliku z funkcją interfejsu do zewnętrznego programu „topar.m”

  25. Matlab plik program plik Matlab • Przykład m-pliku z funkcją interfejsu do zewnętrznego programu „topar.m”

  26. 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

  27. 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

  28. Operowanie na plikach MAT • Biblioteka mat* do czytania i pisania do pliku tablic Matlabowskich • Biblioteka mx* do operacji na tablicach Matlabowskich

  29. 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

  30. 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

  31. Standardowa funkcja MEX w C void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) { /* program ... */ }

  32. Standardowa funkcja MEX w Fortranie subroutine mexFunction(nlhs, plhs, nrhs, prhs) integer nlhs, nrhs integer plhs(*), prhs(*) C program C ...

  33. 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

  34. #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ład mex funkcji

  35. 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

  36. Kompilacja MEX funkcji • Można stosować własny kompilator powszechny kompilator, np. Visual C++, Borland C, Watkom • Matlab posiada własny kompilator. Wywoływany poleceniem mex <options> <filenames> np. mex funkcja.c mex procedura.F funkcje.F

  37. 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

  38. Funkcje biblioteki eng* engOpen, engClose – otwarcie i zamknięcie „silnika” Matlaba Engine – Uchwyt do Matlaba engPutVariable – export zmiennej do Matlaba engGetVariable – import tablicy z Matlaba engEvalString – wykonanie polecenia w Matlabie engOutputBuffer – ustalenie bufora na komunikaty z Matlaba

  39. Dokumentacja • MATLAB External Interfaces „apiext.pdf” (Application Program Interface Guide) MATLAB External Interfaces Reference „apiref.pdf” • MATLAB Compiler • MATLAB COM Builder • MATLAB Excel Builder

  40. 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) ;

  41. 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) ;

  42. 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) ;

  43. 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) ;

  44. 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) ;

  45. Przykład z bibliotek programu rotan WxSHString mord = "v" + IntToStr(valindex) + "=" + ival ; engEvalString(l_engine,mord.c_str()) ;

  46. 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) ;

  47. Przykład z bibliotek programu rotan void __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 ; } }

  48. Kompilatory Matlaba Kompilacja M-plików i tworzenie: • 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

  49. Dziękuję Zadania do domu

  50. Toolboxes Użytkowanie i programowanie Matlaba

More Related