RWalib C Array Library User Guide > More Example Code
  

More Example Code
 
Polynomial evaluation at multiple points in one or multiple dimensions:
The routine alibPolyEvald below evaluates an n-variate polynomial at m points. It handles double-precision real data, but analogous routines for other data types are obtained simply by changing the 'd' suffix on the RWalib routines, e.g. for double-precision complex data, change the d suffixes to z suffixes. Following the code for alibPolyEvald are examples in 1, 2, and 3 dimensions.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "alib.h"
 
/* evaluate the n-variate polynomial defined by d and p at the m points x;  */
/* p is the coefficient array ordered like an n-dimensional array of dimensions d,    */
/* where p(j1,...,jn) is the coefficient for (x1^j1)*...*(xn^jn);           */
/* array x contains the m evaluation points ordered like an (n,m) matrix;   */
/* returned is pointer to m-element array of polynomial values at points x; */
double *alibPolyEvald( wvlong n, wvlong *d, double *p, wvlong m, double *x )
{
    wvlong k, q, *i, *j[64];
    double *f, *g, *r;
    q = alibProdl(n,d);
    i = (wvlong*)malloc(q*sizeof(wvlong));
    for ( k=0; k<n; k++ ) j[k] = (wvlong*)malloc(q*sizeof(wvlong));
    f = (double*)malloc(m*q*sizeof(double));
    g = (double*)malloc(m*q*sizeof(double));
    r = (double*)malloc(m*sizeof(double));
    alibIndexl( q, 0, 1, i );
    alibIndex1dToNd( n, d, q, i, j );
    alibOuterd( alibPowId, m, q, x, NULL, j[0], f, NULL );
    for ( k=1; k<n; k++ ) {
        alibOuterd( alibPowId, m, q, &x[m*k], NULL, j[k], g, NULL );
        alibMultd( m*q, m*q, f, g, f );
    }
    alibMatMuld( m, q, 1, f, p, r );
    free(i);
    free(f);
    free(g);
    return r;
}
 
/* examples for alibPolyEval in 1, 2, and 3 dimensions */
void main() {
    /* array of dimensions to use for each of the examples */
        wvlong d[3]={4,3,2};
    /* array of polynomial coefficients to use for each example */
        double p[24]={2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,2,3,4,5,6,7,8,9};
    /* array of evaluation points to use for each example */
        double x[16]={-2,-3,-4,-5,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,-17};
    /* output array to use for each example */
        double *v;
        v = (double*)malloc(4*sizeof(double));
    printf( "\n\n show the coefficients for p = 2 + 3x + 4x^2 + 5x^3" );
        alibinit( NULL, NULL, NULL, NULL );
        alibPrintArrayd( 1, 1, 1, d[0], p, NULL );
    printf( "\n\n show the three evaluation points x" );
        alibPrintArrayd( 1, 1, 1, 3, x, NULL );
    printf( "\n\n evaluate univariate polynomial p at the three points x" );
        v = alibPolyEvald( 1, d, p, 3, x );
        alibPrintArrayd( 1, 1, 1, 3, v, NULL );
    printf( "\n\n show coefficients for p =        2 +  3y +  4y^2   \n" );
    printf( "                             + x   (  5 +  6y +  7y^2 ) \n" );
    printf( "                             + x^2 (  8 +  9y + 10y^2 ) \n" );
    printf( "                             + x^3 ( 11 + 12y + 13y^2 )   " );
        alibPrintArrayd( 1, 1, d[0], d[1], p, NULL );
    printf( "\n\n show the four evaluation points x" );
        alibPrintArrayd( 1, 1, 2, 4, x, NULL );
    printf( "\n\n evaluate bivariate polynomial p at the four points x" );
        v = alibPolyEvald( 2, d, p, 4, x );
        alibPrintArrayd( 1, 1, 1, 4, v, NULL );
    printf( "\n\n show coefficients for trivariate polynomial p" );
        alibPrintArrayd( 1, d[0], d[1], d[2], p, NULL );
    printf( "\n\n show the two evaluation points x" );
        alibPrintArrayd( 1, 1, 3, 2, x, NULL );
    printf( "\n\n evaluate trivariate polynomial p at the two points x" );
        v = alibPolyEvald( 3, d, p, 2, x );
        alibPrintArrayd( 1, 1, 1, 2, v, NULL );
}
 
Output:
 
 show the coefficients for p = 2 + 3x + 4x^2 + 5x^3
 
 
   2.0000000e+00   3.0000000e+00   4.0000000e+00   5.0000000e+00
 
 
 show the three evaluation points x
 
 
  -2.0000000e+00  -3.0000000e+00  -4.0000000e+00
 
 
 evaluate univariate polynomial p at the three points x
 
 
  -2.8000000e+01  -1.0600000e+02  -2.6600000e+02
 
 
 show coefficients for p =        2 +  3y +  4y^2   
                             + x   (  5 +  6y +  7y^2 ) 
                             + x^2 (  8 +  9y + 10y^2 ) 
                             + x^3 ( 11 + 12y + 13y^2 )   
 
 
   2.0000000e+00   3.0000000e+00   4.0000000e+00
   5.0000000e+00   6.0000000e+00   7.0000000e+00
   8.0000000e+00   9.0000000e+00   1.0000000e+01
   1.1000000e+01   1.2000000e+01   1.3000000e+01
 
 
 show the four evaluation points x
 
 
  -2.0000000e+00  -3.0000000e+00  -4.0000000e+00  -5.0000000e+00
  -6.0000000e+00  -7.0000000e+00  -8.0000000e+00  -9.0000000e+00
 
 
 evaluate bivariate polynomial p at the four points x
 
 
  -2.3140000e+03  -1.2054000e+04  -3.9978000e+04  -1.0336600e+05
 
 
 show coefficients for trivariate polynomial p
 
 
   2.0000000e+00   3.0000000e+00
   4.0000000e+00   5.0000000e+00
   6.0000000e+00   7.0000000e+00
 
   8.0000000e+00   9.0000000e+00
   1.0000000e+01   1.1000000e+01
   1.2000000e+01   1.3000000e+01
 
   1.4000000e+01   1.5000000e+01
   1.6000000e+01   1.7000000e+01
   2.0000000e+00   3.0000000e+00
 
   4.0000000e+00   5.0000000e+00
   6.0000000e+00   7.0000000e+00
   8.0000000e+00   9.0000000e+00
 
 
 show the two evaluation points x
 
 
  -2.0000000e+00  -3.0000000e+00
  -4.0000000e+00  -5.0000000e+00
  -6.0000000e+00  -7.0000000e+00
 
 
 evaluate trivariate polynomial p at the two points x
 
 
   6.2600000e+03   3.5844000e+04
 
 
 
 
Table of Equivalents for PV-WAVE, RWalib, and MATLAB
 
PV-WAVE                 RWalib                              MATLAB
 
 
Performance Utilities
 
set_omp                 alibinit, alibset, alibParallel
systime                 alibtime, alibtick                  now
 
 
Printing Utilities
 
pm                      alibPrintArray                      disp, format
print                   alibPrintArray                      disp, format
 
 
Array Initialization
 
*arr                    alibRep                             zeros
replicate               alibRep                             repmat, zeros, ones
*indgen                 alibIndex                           :, linspace
make_array              alibRep, alibIndex                  :, linspace, repmat
linspace                alibIndex                           :, linspace
=                       alibCopy                            =
reverse                 alibFlip, alibFlipDim               flip
 
 
Type Conversion
 
byte                    alibByte                            uint8
fix                     alibShort                           int16
int32                   alibInt                             int32
long                    alibLong                            int64
float                   alibFloat                           single, real
double                  alibDouble                          double, real
complex                 cmplxflt, alibComplex               complex
dcomplex                cmplxdbl, alibComplex               complex
imaginary               alibImaginary                       imag
 
 
Array Indexing
 
get contiguous array    alibGetRange                        get contiguous array
get general array       alibGetSubset
get general set         alibGetTrace
put contiguous array    alibPutRange, alibPutRangeS         put contiguous array
put general array       alibPutSubset, alibPutSubsetS
put general set         alibPutTrace, alibPutTraceS
index_conv              alibIndex1dToNd                     ind2sub
index_conv              alibIndexNdTo1d, alibGetOffsets     sub2ind
 
 
Searches and Intersections
 
wherefirst              alibCount, alibFind                 find
where                   alibCount, alibFind                 find
wherein                 alibIntersectS, alibIntersect       intersect, setdiff
whereinvec              alibIntersect                       intersect, setdiff
 
 
Concatenation and Tiling
 
[]                      alibConcat, alibInterleave          cat, horzcat
[]                      alibConcatR                         cat, vertcat
rebin(,/sample)         alibRepArray                        repmat
expand                  alibRepArray                        repmat
replv                   alibRepArray                        repmat
cprod                   alibCartProd                        ndgrid
 
 
Logical Operations
 
not                     alibNot                             bitcmp
and                     alibAnd                             bitand
or                      alibOr                              bitor
xor                     alibXor                             bitxor
 
 
Relational Operations
 
eq                      alibEq                              ==
ne                      alibNe, alibFirstDiff               ~=
le                      alibLe                              <=
ge                      alibGe                              >=
lt                      alibLt                              <
gt                      alibGt                              >
<                       alibLesser, alibThreshold           min
>                       alibGreater, alibThreshold          max
 
 
Rounding Operations
 
great_int               alibFloor                           floor
small_int               alibCeil                            ceil
nint                    alibRound                           round
 
 
Min and Max
 
min                     alibMinMax, alibMinMaxDim           min
max                     alibMinMax, alibMinMaxDim           max
 
 
Sort and Unique
 
sort                    alibSort                            sort
sortdim                 alibSort                            sort
sortn                   alibSort                            sortrows
unique                  alibUnique                          unique
uniqn                   alibUnique                          unique
 
 
Arithmetic Operations
 
+                       alibAdd                             +
-                       alibNeg, alibSubt                   -
*                       alibMult                            .*
/                       alibDiv                             ./
mod                     alibMod                             mod
conj                    alibConj                            conj
abs                     alibAbs                             abs
total                   alibSum, alibSumDim                 sum
sum                     alibSum, alibSumDim                 sum 
cumsum                  alibCumSum                          cumsum
product                 alibProd                            prod
 
 
Exponentiation and Logarithms
 
^                       alibPowI, alibPow                           .^
expon                   alibPowI, alibPow                           .^
sqrt                    alibSqrt                                    sqrt
exp                     alibExp                                     exp
alog                    alibLog                                     log
alog10                  alibLog10                                   log10
 
 
Broadcast Vector Over Array
 
vecoverarr_*            alibVecOverArr                              bsxfun
 
 
Hyperbolic Functions
 
cosh                    alibCosh                                    cosh
sinh                    alibSinh                                    sinh
tanh                    alibTanh                                    tanh
 
 
Trigonometric Functions
 
cos                     alibCos                                     cos
sin                     alibSin                                     sin
tan                     alibTan                                     tan
acos                    alibAcos                                    acos
asin                    alibAsin                                    asin
atan                    alibAtan, alibAtan2, alibArg                atan, atan2
 
 
Linear Algebra
 
tensor_*                alibOuter                                   
#                       alibMatMul                                  *
spmvm                   alibSpMVM                                   
transpose               alibTranspose                               .', permute
adjoint                 alibAdjoint                                 '
arraytrace              alibTrace
 

Version 2017.1
Copyright © 2019, Rogue Wave Software, Inc. All Rights Reserved.