Transcript A(i,:,end)

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 |xf'(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 :
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
Obliczenia równoległe
• Obliczenia na wielu rdzeniach/procesorach
komputera
• Obliczenia na klastrze
• Obliczenia na karcie graficznej
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
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 parfor
clear A
for i = 1:8
A(i) = i;
end
A
clear A
parfor 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
Rodzaje zmiennych w pętli
parfor
Loop variables
Sliced variables
Broadcast variables
Reduction variables
Temporary variables
Loop variables
parfor i = 1:n
i = i + 1;
a(i) = i;
end
Sliced Variables
parfor i = 1:length(A)
B(i) = f(A(i));
end
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
Praca domowa
C(1:k) = A(2:k+1);
parfor i = 1:k
B(:) = h(A(i),C(i));
end
Sliced Variables
A(i+f(k),j,:,3)
A(i,20:30,end)
A(i,:,s.field1)
A(i+k,j,:,3)
A(i,:,end)
A(i,:,k)
• Prawidłowe i nieprawidłowe indeksowanie
Broadcast Variables
Jest rozsyłany do wszystkich wątków
Reduction Variables
x = 0;
parfor i = 1:10
x = x + i;
end
x
x2 = [];
n = 10;
parfor i = 1:n
x2 = [x2, i];
end
x2
Akumulują wartości po wszystkich pętlach
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
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);
gpuDeviceCount
gpuDevice(2)
Współpraca Matlaba z innymi
programami
• Matlab plik Program
• Program plik (ASCII, EXEL)
• Matlab plik MAT Program
Matlab
• Matlab plik Program plik Matlab
• Matlab funkcja (C/C++, Fortran)
• Program (C/C++, Fortran) Matlab
Matlab plik Pogram plik Matlab
Funkcje użyteczne
save … -ascii -double -tabs
load
fopen
fprintf,
fscanf, fgetl, fgets,
fclose
fwrite
fread
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
C
C
subroutine mexFunction(nlhs, plhs, nrhs, prhs)
integer nlhs, nrhs
integer plhs(*), prhs(*)
program
...
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
poleceniem
mex <options> <filenames>
np.
mex funkcja.c
mex 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 Matlaba
engPutVariable – export zmiennej do Matlaba
engGetVariable – import tablicy z Matlaba
engEvalString – wykonanie polecenia w
Matlabie
engOutputBuffer – 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 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 ;
}
}
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
Dziękuję
Zadania do domu
Użytkowanie i programowanie
Matlaba
Toolboxes
Signal processing
Analiza filtrów analogowych i cyfrowych
Tworzenie filtrów FIR i IIR
Analiza spektralna i cepstralna
Analiza sygnałów statystycznych – widma
mocy sygnału
Predykcja liniowa
Generacja fal
Signal processing – narzędzia GIU
Opracowanie i analiza filtrów
Opracowanie i analiza okienkowania
Drukowanie 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ściowego
Badanie poprawności modelu
Badanie wpływu szumu na pomiar
Obiekty liniowe i nieliniowe
Optimization
Minimalizacja skalara
Minimalizacja funkcji z ograniczeniami i bez
ograniczeń
Programowanie liniowe i kwadratowe
Optymalizacja wielokryterialna
Numeryczne rozwiązywanie równań liniowych i
nieliniowych
Metody najmniejszych kwadratów (dopasowywanie
krzywych)
Inne narzędzia
Komercyjne
- dostarczane przez MathWorks
- dostarczane przez innych producentów
Darmowe
- 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: 321512
Operating 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)