Polynomial reading (Scilab gateway) — How to read matrices of polynomials in a gateway.
Input argument profile:
SciErr getMatrixOfPoly(void* _pvCtx, int* _piAddress, int* _piRows, int* _piCols, int* _piNbCoef, double** _pdblReal)
SciErr getComplexMatrixOfPoly(void* _pvCtx, int* _piAddress, int* _piRows, int* _piCols, int* _piNbCoef, double** _pdblReal, double** _pdblImg)
Named variable profile:
SciErr readNamedMatrixOfPoly(void* _pvCtx, char* _pstName, int* _piRows, int* _piCols, int* _piNbCoef, double** _pdblReal)
SciErr readNamedComplexMatrixOfPoly(void* _pvCtx, char* _pstName, int* _piRows, int* _piCols, int* _piNbCoef, double** _pdblReal, double** _pdblImg)
Scilab environment pointer, pass in "pvApiCtx" provided by api_scilab.h.
Address of the Scilab variable.
Name of the variable for "named" functions.
Return number of rows.
Return number of columns.
Return number of coefficient for each polynomial. (must be allocated)
Address of array of double* with imaginary part of coefficient (size: _iCols * _iRows, must be allocated)
Address of array of double* with imaginary part of coefficient (size: _iCols * _iRows, must be allocated)
Error structure where is stored errors messages history and first error number.
int read_poly(char *fname,unsigned long fname_len)
{
SciErr sciErr;
int i,j;
//variable info
int iRows = 0;
int iCols = 0;
int iVarLen = 0;
int* piAddr = NULL;
int* piNbCoef = NULL;
double** pdblReal = NULL;
double** pdblImg = NULL;
char* pstVarname = NULL;
//check input and output arguments
CheckRhs(1,1);
CheckLhs(1,1);
sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
if(sciErr.iErr)
{
printError(&sciErr, 0);
return 0;
}
if(isVarComplex(pvApiCtx, piAddr) == FALSE)
{
//Error
return 0;
}
//get variable name length
sciErr = getPolyVariableName(pvApiCtx, piAddr, NULL, &iVarLen);
if(sciErr.iErr)
{
printError(&sciErr, 0);
return 0;
}
//alloc buff to receive variable name
pstVarname = (char*)malloc(sizeof(char) * (iVarLen + 1));//1 for null termination
//get variable name
sciErr = getPolyVariableName(pvApiCtx, piAddr, pstVarname, &iVarLen);
if(sciErr.iErr)
{
printError(&sciErr, 0);
return 0;
}
//First call: retrieve dimmension
sciErr = getComplexMatrixOfPoly(pvApiCtx, piAddr, &iRows, &iCols, NULL, NULL, NULL);
if(sciErr.iErr)
{
printError(&sciErr, 0);
return 0;
}
//alloc array of coefficient
piNbCoef = (int*)malloc(sizeof(int) * iRows * iCols);
//Second call: retrieve coefficient
sciErr = getComplexMatrixOfPoly(pvApiCtx, piAddr, &iRows, &iCols, piNbCoef, NULL, NULL);
if(sciErr.iErr)
{
printError(&sciErr, 0);
return 0;
}
//alloc arrays of data
pdblReal = (double**)malloc(sizeof(double*) * iRows * iCols);
pdblImg = (double**)malloc(sizeof(double*) * iRows * iCols);
for(i = 0 ; i < iRows * iCols ; i++)
{
pdblReal[i] = (double*)malloc(sizeof(double) * piNbCoef[i]);
pdblImg[i] = (double*)malloc(sizeof(double) * piNbCoef[i]);
}
//Third call: retrieve data
sciErr = getComplexMatrixOfPoly(pvApiCtx, piAddr, &iRows, &iCols, piNbCoef, pdblReal, pdblImg);
if(sciErr.iErr)
{
printError(&sciErr, 0);
return 0;
}
//Do something with Data
//Invert polynomials in the matrix and invert coefficients
for(i = 0 ; i < (iRows * iCols) / 2 ; i++)
{
int iPos1 = iRows * iCols - 1 - i;
double* pdblSave = NULL;
int iNbCoefSave = 0;
//switch array of coefficient
pdblSave = pdblReal[i];
pdblReal[i] = pdblReal[iPos1];
pdblReal[iPos1] = pdblSave;
pdblSave = pdblImg[i];
pdblImg[i] = pdblImg[iPos1];
pdblImg[iPos1] = pdblSave;
//switch number of coefficient
iNbCoefSave = piNbCoef[i];
piNbCoef[i] = piNbCoef[iPos1];
piNbCoef[iPos1] = iNbCoefSave;
}
//switch coefficient
for(i = 0 ; i < iRows * iCols ; i++)
{
for(j = 0 ; j < piNbCoef[i] /2 ; j++)
{
int iPos2 = piNbCoef[i] - 1 - j;
double dblVal = pdblReal[i][j];
pdblReal[i][j] = pdblReal[i][iPos2];
pdblReal[i][iPos2] = dblVal;
dblVal = pdblImg[i][j];
pdblImg[i][j] = pdblImg[i][iPos2];
pdblImg[i][iPos2] = dblVal;
}
}
sciErr = createComplexMatrixOfPoly(pvApiCtx, Rhs + 1, pstVarname, iRows, iCols, piNbCoef, pdblReal, pdblImg);
if(sciErr.iErr)
{
printError(&sciErr, 0);
return 0;
}
//free OS memory
free(pstVarname);
free(piNbCoef);
for(i = 0 ; i < iRows * iCols ; i++)
{
free(pdblReal[i]);
free(pdblImg[i]);
}
free(pdblReal);
free(pdblImg);
//assign allocated variables to Lhs position
LhsVar(1) = Rhs + 1;
return 0;
}
coeff1 = [ ..
29*%i,22*%i,16*%i,11*%i,7*%i,30,23,17,12,8,-31*%i,-24*%i,-18*%i,-13*%i,-9*%i,32,25,19,14,10,-33*%i,-26*%i,-20*%i,-15*%i,0,34,27,21,0,0,0,-28*%i,0,0,0,36-35*%i,0,0,0,0; ..
4*%i,2*%i,%i,22,16,5,-3,0,-23*%i,-17*%i,-6*%i,0,0,24,18,0,0,0,-25*%i,-19*%i,0,0,0,26,20,0,0,0,-27*%i,-21*%i,0,0,0,28,0,0,0,0,0,0; ..
11,7,4,2,1,-12*%i,-8*%i,-5*%i,3*%i,0,13,9,6,0,0,-14*%i,-10*%i,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
x = poly(0, "x");
p1 = 1;
p2 = 2 * x + 3 * %i;
p3 = 4 * x**2 - 5 * %i * x + 6;
p4 = 7 * x**3 - 8 * %i * x**2 + 9 * x - 10 * %i;
p5 = 11 * x**4 - 12 * %i * x**3 + 13 * x**2 - 14 * %i * x + 15;
p6 = 16 * x**5 - 17 * %i * x**4 + 18 * x**3 - 19 * %i * x**2 + 20 * x - 21 * %i;
p7 = 22 * x**6 - 23 * %i * x**5 + 24 * x**4 - 25 * %i * x**3 + 26 * x**2 - 27 * %i * x + 28;
p8 = %i;
p9 = 2 * %i * x - 3;
p10 = 4 * %i * x**2 + 5 * x - 6 * %i;
p11 = 7 * %i * x**3 + 8 * x**2 - 9 * %i * x + 10;
p12 = 11 * %i * x**4 + 12 * x**3 - 13 * %i * x**2 + 14 * x - 15 * %i;
p13 = 16 * %i * x**5 + 17 * x**4 - 18 * %i * x**3 + 19 * x**2 - 20 * %i * x + 21;
p14 = 22 * %i * x**6 + 23 * x**5 - 24 * %i * x**4 + 25 * x**3 - 26 * %i * x**2 + 27 * x - 28 * %i;
p15 = 29 * %i * x**7 + 30 * x**6 - 31 * %i * x**5 + 32 * x**4 - 33 * %i * x**3 + 34 * x**2 - 35 * %i + 36;
p = [p1, p2, p3, p4, p5 ; p6, p7, p8, p9 ,p10 ; p11, p12, p13, p14, p15];
p1 = read_poly(p);
coeff2 = coeff(p1);
if or(coeff2 <> coeff1) then error("failed"), end