lapack sgetrs tutorial
I have a problem to solving system linear equation Ax=b using lapack. I am planned to use sgetrs subroutine in lapack to solving system linear equation Ax=b.
sgetrs descriptions is a subroutine to Solves a system of linear equations with an LU-factored square coefficient matrix, with multiple right-hand sides. So, we need to process our data with LU-factored before use sgetrs lapack.
I have create a C/C++ code to give tutorial how to call sgetrs lapack from C/C++ code. I have compared the result from this sgetrs lapack with Matlab and give the same result. Please check this code below (call sgetrs lapack from C/C++) :
/*
* main.c
*
* Created on: 21 Apr, 2016
* Author: toto
*/
#include <stdlib.h>
#include <stdio.h>
extern void sgetrf_(int *N, int *NRHS, float *A,
int *LDA, int *IPIV, int *INFO );
extern void sgetrs_(char *TRANS, int *N, int *NRHS, float *A,
int *LDA, int *IPIV, float *B, int *LDB, int *INFO );
void print1float(char *ca, float *a, int n)
{
int i;
fprintf(stderr, "%s:\n", ca);
for(i=0; i<n; i++)
fprintf(stderr, "%f \n", a[i]);
fprintf(stderr, "\n");
}
void print2float(char *ca, float *a, int nrow, int ncol)
{
int i, j, ii;
ii = 0;
fprintf(stderr, "%s:\n", ca);
for(i=0; i<nrow; i++)
{
for(j=0; j<ncol; j++)
{
fprintf(stderr, "%f \t", a[ii]);
ii = ii+1;
}
fprintf(stderr, "\n");
}
fprintf(stderr, "\n");
}
int main(int argc, char **argv)
{
float A[16] = {
0.5377, 0.3188, 3.5784, 0.7254,
1.8339, -1.3077, 2.7694, -0.0631,
-2.2588, -0.4336, -1.3499, 0.7147,
0.8622, 0.3426, 3.0349, -0.2050};
float b[4] = {1,2,3,4};
int i;
char trans = 'T';
int dim = 4;
int nrhs = 1;
int LDA = dim;
int LDB = dim;
int info;
int ipiv[4];
//show input array
print2float("Input A", A, dim, LDA);
print1float("Input b" , b, dim);
//compute LU decomposition
sgetrf_(&dim, &dim, A, &LDA, ipiv, &info);
print2float("LU A", A, dim, LDA);
//solve Ax = b
sgetrs_(&trans, &dim, &nrhs, A, &LDA, ipiv, b, &LDB, &info);
print1float("x" , b, dim);
return(0);
}
We can compile this code (call sgetrs lapack from C/C++) using command :
gcc main.c -lm -llapack -lblas -o main
Sample output after running this code (call sgetrs lapack from C/C++) :
Input A: 0.537700 0.318800 3.578400 0.725400 1.833900 -1.307700 2.769400 -0.063100 -2.258800 -0.433600 -1.349900 0.714700 0.862200 0.342600 3.034900 -0.205000 Input b: 1.000000 2.000000 3.000000 4.000000 LU A: 3.578400 0.089090 0.150263 0.202716 2.769400 -1.554426 -0.912081 0.401758 -1.349900 -0.313337 -2.341749 -0.475812 3.034900 0.072220 0.472039 -0.624637 x: -4.261576 -2.205967 2.362486 -6.147243