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.