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

Użytkowanie i programowanie Matlaba

  • Upload
    topper

  • View
    73

  • Download
    1

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: Użytkowanie i programowanie Matlaba

Użytkowanie i programowanie Matlaba

Współpraca z programami w C

Page 2: Użytkowanie i programowanie Matlaba

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)|

Page 3: Użytkowanie i programowanie Matlaba

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.

Page 4: Użytkowanie i programowanie Matlaba

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.

Page 5: Użytkowanie i programowanie Matlaba

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

Page 6: Użytkowanie i programowanie Matlaba

Obliczenia równoległe

• Obliczenia na wielu rdzeniach/procesorach komputera

• Obliczenia na klastrze• Obliczenia na karcie graficznej

Page 7: Użytkowanie i programowanie Matlaba

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

Page 8: Użytkowanie i programowanie Matlaba

Podstawowe operatory dla obliczeń równoległych

- parfor- batch- spmd- pmode

Page 9: Użytkowanie i programowanie Matlaba

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

Page 10: Użytkowanie i programowanie Matlaba

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

Page 11: Użytkowanie i programowanie Matlaba

Rodzaje zmiennych w pętli parfor

Loop variables Sliced variables Broadcast variablesReduction variablesTemporary variables

Page 12: Użytkowanie i programowanie Matlaba

Loop variables

parfor i = 1:n i = i + 1; a(i) = i;end

Page 13: Użytkowanie i programowanie Matlaba

Sliced Variablesparfor i = 1:length(A) B(i) = f(A(i));end

Page 14: Użytkowanie i programowanie Matlaba

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

Page 15: Użytkowanie i programowanie Matlaba

Praca domowaC(1:k) = A(2:k+1);parfor i = 1:kB(:) = h(A(i),C(i));end

Page 16: Użytkowanie i programowanie Matlaba

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)

Page 17: Użytkowanie i programowanie Matlaba

Broadcast Variables

Jest rozsyłany do wszystkich wątków

Page 18: Użytkowanie i programowanie Matlaba

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

Page 19: Użytkowanie i programowanie Matlaba

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

Page 20: Użytkowanie i programowanie Matlaba

pmode

Page 21: Użytkowanie i programowanie Matlaba

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)

Page 22: Użytkowanie i programowanie Matlaba

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

Page 23: Użytkowanie i programowanie Matlaba

Matlab plik Pogram plik MatlabFunkcje użyteczne

save … -ascii -double -tabsload

fopenfprintf, fwrite fscanf, fgetl, fgets, freadfclose

Page 24: Użytkowanie i programowanie Matlaba

Matlab plik program plik Matlab

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

Page 25: Użytkowanie i programowanie Matlaba

Matlab plik program plik Matlab

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

Page 26: Użytkowanie i programowanie Matlaba

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

Page 27: Użytkowanie i programowanie Matlaba

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

Page 28: Użytkowanie i programowanie Matlaba

Operowanie na plikach MAT

• Biblioteka mat* do czytania i pisania do pliku tablic Matlabowskich

• Biblioteka mx* do operacji na tablicach Matlabowskich

Page 29: Użytkowanie i programowanie Matlaba

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

Page 30: Użytkowanie i programowanie Matlaba

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

Page 31: Użytkowanie i programowanie Matlaba

Standardowa funkcja MEX w C

void mexFunction(int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[]){/* program ... */}

Page 32: Użytkowanie i programowanie Matlaba

Standardowa funkcja MEX w Fortranie

subroutine mexFunction(nlhs, plhs, nrhs, prhs)integer nlhs, nrhsinteger plhs(*), prhs(*)

C programC ...

Page 33: Użytkowanie i programowanie Matlaba

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

Page 34: Użytkowanie i programowanie Matlaba

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 ; }}

Page 35: Użytkowanie i programowanie Matlaba

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

Page 36: Użytkowanie i programowanie Matlaba

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

Page 37: Użytkowanie i programowanie Matlaba

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

Page 38: Użytkowanie i programowanie Matlaba

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

Page 39: Użytkowanie i programowanie 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

Page 40: Użytkowanie i programowanie Matlaba

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

Page 41: Użytkowanie i programowanie Matlaba

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

Page 42: Użytkowanie i programowanie Matlaba

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

Page 43: Użytkowanie i programowanie Matlaba

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

Page 44: Użytkowanie i programowanie Matlaba

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

Page 45: Użytkowanie i programowanie Matlaba

Przykład z bibliotek programu rotan

WxSHString mord = "v" + IntToStr(valindex) + "=" + ival ; engEvalString(l_engine,mord.c_str()) ;

Page 46: Użytkowanie i programowanie Matlaba

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

Page 47: Użytkowanie i programowanie Matlaba

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 ; }}

Page 48: Użytkowanie i programowanie Matlaba

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:

Page 49: Użytkowanie i programowanie Matlaba

Dziękuję

Zadania do domu

Page 50: Użytkowanie i programowanie Matlaba

Użytkowanie i programowanie Matlaba

Toolboxes

Page 51: Użytkowanie i programowanie Matlaba

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

Page 52: Użytkowanie i programowanie Matlaba

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

Page 53: Użytkowanie i programowanie Matlaba

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

Page 54: Użytkowanie i programowanie Matlaba

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)

Page 55: Użytkowanie i programowanie Matlaba

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ść

Page 56: Użytkowanie i programowanie Matlaba

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)