Matrix Vandermonde Code
I am very interesting with polyfit code in Matlab. I try to convert this polyfit code in Matlab to C. When I try create code polyfit from Matlab to C, I get a function vander in Matlab. vander is Matlab function to create matrix vandermonde. After searching about matrix vandermonde, I try to create matrix vandermonde code in C. In linear algebra, a Vandermonde matrix, named after Alexandre-Théophile Vandermonde, is a matrix with the terms of a geometric progression in each row, i.e., an m × n matrix (from wikipedia). I get this equation to create matrix vandermonde code :
Output from this matrix vandermonde is a matrix 2D. You can read my last post about how to create 2D array in C/C++ in here. From my example to create Matrix Vandermonde, I create input array 1D with value [1 2 3 4 5]. This is my matrix vandermonde code in C. Save this code with name vandermonde.c.
/* matrix vandermonde code.c * create by toto_plg@yahoo.com * 07/25/2011 * http://toto-share.com */ #include <stdlib.h> #include <stdio.h> #include <math.h> int **array2_create(int row, int col); /* create array 2D */ void array2_free(int **arr); /* free array 2D */ void printArray2(char *var, int **arr, int nx, int ny); void printArray1(char *var, int *arr, int nx); void createVandermonde(int *iarr, int **vander, int nx); int main(int argc, char **argv) { int nx; int *iarr, **vandermonde; int i; nx = 5; vandermonde = array2_create(nx, nx); /* create output matrix vandermonde */ iarr = (int*) calloc (nx, sizeof(int)); for(i=0; i<nx; i++) //fill iarr by value iarr[i] = i+1; createVandermonde(iarr, vandermonde, nx); /* vandermonde process */ printArray1("iarr", iarr, nx); //print input array printArray2("vandermonde", vandermonde, nx, nx); //print input array /* free allocated memory */ free(iarr); array2_free(vandermonde); } void createVandermonde(int *iarr, int **vander, int nx) { int i, j; for(i=0; i<nx; i++) for(j=0; j<nx; j++) vander[i][j] = pow(iarr[i], nx-j-1); } int **array2_create(int row, int col) { int i; int **arr=NULL; /* allocate pointers to rows */ arr = (int **) malloc((row*sizeof(int*))); if (!arr) { fprintf(stderr, "matrixi_create : error allocation row"); exit(0); } /* allocate rows and set pointers to them */ arr[0]=(int*) malloc((row*col)*sizeof(int)); if (!arr[0]) { fprintf(stderr, "matrixi_create : error allocation column"); exit(0); } for(i=1; i<row; i++) arr[i]=arr[i-1] + col; /* return pointer to array of pointers to rows */ return arr; } void array2_free(int **arr) { free (arr[0]); free (arr); } void printArray2(char *var, int **arr, int nx, int ny) { int i, j; printf("Array %s \n", var); for(i=0; i<ny; i++) { for(j=0; j<nx; j++) printf("%i \t", arr[i][j]); printf("\n"); } printf("\n\n"); } void printArray1(char *var, int *arr, int nx) { int i; printf("Array %s \n", var); for(i=0; i<nx; i++) printf("%i \t", arr[i]); printf("\n\n"); }
You can save this code and compile this matrix vandermonde code with command :
gcc vandermonde.c -lm -o vandermonde
This is output from my matrix vandermonde code in C :
toto@toto-laptop:~/Documents$ ./vandermonde Array iarr 1 2 3 4 5 Array vandermonde 1 1 1 1 1 16 8 4 2 1 81 27 9 3 1 256 64 16 4 1 625 125 25 5 1
Output from this my matrix vandermonde code in C is equal with output from Matlab.