Lapack
From charlesreid1
Contents
Calling Lapack functions
Calling from C
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
extern void sgetri_ ( int* n, const void* A, int* lda,
int* ipiv, const void* work, int* lwork, int* info );
extern void sgetrf_ ( int* m, int* n, const void* a, int* lda,
int* ipiv, int* info );
int main (void) {
// A matrix (the one being inverted)
float A[] = {1,3,2,4}; // Matrix [1 2
// 3 4]
// (matrices have to be provided to Lapack as 1-D arrays)
int i,j,n;
int lda, arows, acols;
int ipiv[4];
int info;
// Set the dimension of A
n=2;
arows=n;
acols=n;
// Set the leading dimension of A
lda=2;
// Set the dimension of the "workspace" array WORK
// see http://www.netlib.org/lapack-dev/lapack-coding/program-style.html#workspace
int lwork=100;
float work[lwork];
printf ("Matrix A before any calls:\n");
for (i=0;i<n;i++) {
for (j=0;j<n;j++)
printf ("A[%d][%d]:%f\t", i,j, A[n*j+i]); // this looks backwards, but it's b
printf ("\n");
}
printf ("\n");
// Allocate memory for arrays:
// Pivot indices array
memset (ipiv, 0, sizeof(int)*4);
// Work (workspace) array
memset (work, 0, sizeof(float)*100);
// -------------------------------------------
// Calculate the LU decomposition of A (and store it in A)
// see http://www.netlib.org/lapack/single/sgetrf.f
sgetrf_ ( &arows, &acols, A, &lda, ipiv, &info );
printf ("Matrix A after sgetrf\n");
for (i=0;i<2;i++) {
for (j=0;j<2;j++) {
printf("A[%d][%d]:%f\t", i,j, A[n*j+i]); // this looks backwards, but it's be
}
printf("\n");
}
if( info != 0 ) {
printf("sgetrf_ returned an error! \n");
}
printf ("\n");
// -------------------------------------------
// Calculate the inverse of A using the LU decomposition of A
// http://www.netlib.org/lapack/single/sgetri.f
sgetri_ (&n, A, &lda, ipiv, work, &lwork, &info);
printf ("Matrix A after sgetri\n");
for (i=0;i<2;i++) {
for (j=0;j<2;j++) {
printf("A[%d][%d]:%f\t", i,j, A[n*j+i]); // this looks backwards, but it's be
}
printf("\n");
}
if( info != 0 ) {
printf("sgetri_ returned an error! \n");
}
printf ("\n");
return(0);
}
Calling from C++
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
extern "C" void sgetri_ ( int* n, const void* A, int* lda,
int* ipiv, const void* work, int* lwork, int* info );
extern "C" void sgetrf_ ( int* m, int* n, const void* a, int* lda,
int* ipiv, int* info );
int main (void) {
// A matrix (the one being inverted)
float A[] = {1,3,2,4}; // Matrix [1 2
// 3 4]
// (matrices have to be provided to Lapack as 1-D arrays)
int i,j,n;
int lda, arows, acols;
int ipiv[4];
int info;
// Set the dimension of A
n=2;
arows=n;
acols=n;
// Set the leading dimension of A
lda=2;
// Set the dimension of the "workspace" array WORK
// see http://www.netlib.org/lapack-dev/lapack-coding/program-style.html#workspace
int lwork=100;
float work[lwork];
printf ("Matrix A before any calls:\n");
for (i=0;i<n;i++) {
for (j=0;j<n;j++)
printf ("A[%d][%d]:%f\t", i,j, A[n*j+i]); // this looks backwards, but it's b
printf ("\n");
}
printf ("\n");
// Allocate memory for arrays:
// Pivot indices array
memset (ipiv, 0, sizeof(int)*4);
// Work (workspace) array
memset (work, 0, sizeof(float)*100);
// -------------------------------------------
// Calculate the LU decomposition of A (and store it in A)
// see http://www.netlib.org/lapack/single/sgetrf.f
sgetrf_ ( &arows, &acols, A, &lda, ipiv, &info );
printf ("Matrix A after sgetrf\n");
for (i=0;i<2;i++) {
for (j=0;j<2;j++) {
printf("A[%d][%d]:%f\t", i,j, A[n*j+i]); // this looks backwards, but it's be
}
printf("\n");
}
if( info != 0 ) {
printf("sgetrf_ returned an error! \n");
}
printf ("\n");
// -------------------------------------------
// Calculate the inverse of A using the LU decomposition of A
// http://www.netlib.org/lapack/single/sgetri.f
sgetri_ (&n, A, &lda, ipiv, work, &lwork, &info);
printf ("Matrix A after sgetri\n");
for (i=0;i<2;i++) {
for (j=0;j<2;j++) {
printf("A[%d][%d]:%f\t", i,j, A[n*j+i]); // this looks backwards, but it's be
}
printf("\n");
}
if( info != 0 ) {
printf("sgetri_ returned an error! \n");
}
printf ("\n");
return(0);
};
Compiling with Lapack
Compiling C/C++
C and C++ code using Lapack can be compiled with any standard C/C++ compiler; in this example, gcc and g++.
Linux
On Linux, C code using Lapack can be compiled by linking to Lapack libraries. In most cases, the Lapack libraries are located in /usr/lib:
$ ls /usr/lib | grep lapack liblapack-3.a liblapack-3.so liblapack.a liblapack.so
To link to the Lapack libraries, the -l and -L flags must be used:
$ gcc lapack.c -llapack -L/usr/lib -o bin.x
For more details on libraries, see C++, or the Summer Workshop on Scientific Computing (Number 2, Software) at the Presentations page.
Likewise, C++ code can be compiled using:
$ g++ lapack.cpp -llapack -L/usr/lib -o bin.x
Mac
Using Lapack on a Mac is more straightforward, since Macs come pre-built with an ATLAS version of Lapack, Blas, etc. These are packaged in a vector library framework. The compiler can be pointed to these using:
$ gcc lapack.c -framework vecLib -o bin.x
Similarly, C++ code can be compiled with the same -framework compiler flag:
$ g++ lapack.cpp -framework vecLib -o bin.x
Useful Lapack functions
http://www.netlib.org/lapack/double/
Matrix inversion
Eigenvalues
External References
- Using Lapack from C: http://icl.cs.utk.edu/lapack-forum/viewtopic.php?f=2&t=171
- Using Lapack from C++: http://icl.cs.utk.edu/lapack-forum/viewtopic.php?f=2&t=2058
| Scientific Computing Topics in scientific computing.
Numerical Software: Lapack · Sundials · Matlab · Octave · FFTW Petsc · Example Petsc Makefile · Trilinos · Hypre · Ginac · Gnuplot
Python: Numpy · Scipy · Pandas · Matplotlib · Python Sundials · Py4Sci Scikit-learn: Sklearn · Skimage
|
| Linear Algebra Topics in linear algebra.
Matlab · Octave · Sundials · Trilinos
|