From 93ad6a810479a5cc09a809f2ea23d549c7cc9c2a Mon Sep 17 00:00:00 2001 From: ultramn Date: Fri, 16 Dec 2016 13:50:55 -0800 Subject: Added dclapack.h --- dave/dclapack.h | 188 +++++++++++++++++++++++++++++++++++++++++++++++++++ dave/dclapack_test.c | 33 +++++++++ 2 files changed, 221 insertions(+) create mode 100644 dave/dclapack.h create mode 100644 dave/dclapack_test.c (limited to 'dave') diff --git a/dave/dclapack.h b/dave/dclapack.h new file mode 100644 index 0000000..36fad53 --- /dev/null +++ b/dave/dclapack.h @@ -0,0 +1,188 @@ +#ifndef __DCLAPACK_H__ +#define __DCLAPACK_H__ + +#ifndef ORDER +#define ORDER 50 +#endif + +#ifndef FLOAT +#define FLOAT float +#endif + +#include + +/* + * Prints a matrix A (n by m) + */ +#define PRINT(A,n,m) { \ + int i,j; \ + printf(#A "\n"); \ + for (i=0; i U[max][i]) { max = j; } \ + } \ + _tempi=Piv[i]; Piv[i]=Piv[max]; Piv[max]=_tempi; \ + for (k=i; k=0; j--) { \ + float sum=0.0; \ + for (k=n-1; k>j; k--) { sum += U[j][k]*X[k][i]; } \ + X[j][i] = (B[j][i] - sum) / U[j][j]; \ + } \ + } \ +} + +/* + * Inverts a matrix X (n by n) using the method of LU decomposition + */ +#define INV(A,Ainv,n) { \ + FLOAT Ipiv[ORDER][ORDER]; \ + FLOAT L[ORDER][ORDER]; \ + FLOAT U[ORDER][ORDER]; \ + FLOAT I[ORDER][ORDER]; \ + FLOAT C[ORDER][ORDER]; \ + int Piv[ORDER]; \ + IDENTITY(I,n); \ + LU(A,L,U,Piv,n); \ + PIVOT(I,Ipiv,Piv,n,n); \ + L_SUB(L,C,Ipiv,n,n); \ + U_SUB(U,Ainv,C,n,n); \ +} + +/* +PRINT(A,n,n); \ +PRINT(L,n,n); \ +PRINT(U,n,n); \ +MUL(L,U,LU,n,n,n);\ +PRINT(LU,n,n);\ +PRINT(C,n,n); \ +PRINT(Ainv,n,n); \ +*/ + +/* + * Matrix Multiply C = A * B + * A (n by m) + * B (m by p) + * C (n by p) + */ +#define MUL(A,B,C,n,m,p) { \ + int i,j,k; \ + for (i=0; i +#include + +int main() +{ + float A[ORDER][ORDER]; + float Ainv[ORDER][ORDER]; + float Prod[ORDER][ORDER]; + + int i, j, n = 12; + srand(7779); + + for(i=0; i