Scilab Home page | Wiki | Bug tracker | Forge | Mailing list archives | ATOMS | File exchange
Please login or create an account
Change language to: English - Português - Русский - 日本語

Please note that the recommended version of Scilab is 6.0.0. This page might be outdated.
See the recommended documentation of this function

Aide de Scilab >> API Scilab > Low level functions > Double writing (Scilab gateway)

Double writing (Scilab gateway)

How to write matrices of doubles in a gateway.

Create from existing data.

Calling Sequence

Input argument profile:

SciErr createMatrixOfDouble(void* _pvCtx, int _iVar, int _iRows, int _iCols, const double* _pdblReal)
SciErr createComplexMatrixOfDouble(void* _pvCtx, int _iVar, int _iRows, int _iCols, const double* _pdblReal, double* _pdblImg)

Named variable profile:

SciErr createNamedMatrixOfDouble(void* _pvCtx, const char* _pstName, int _iRows, int _iCols, const double* _pdblReal)
SciErr createNamedComplexMatrixOfDouble(void* _pvCtx, const char* _pstName, int _iRows, int _iCols, const double* _pdblReal, const double* _pdblImg)

Arguments

_pvCtx

Scilab environment pointer, pass in "pvApiCtx" provided by api_scilab.h.

_iVar

Position in the Scilab memory where you want to put the variable.

_pstName

Name of the variable for "named" functions.

_iRows

Number of rows of the new variable.

_iCols

Numbers of columns of the new variable.

_pdblReal

Address of real data array (size: _iCols * _iRows).

_pdblImg

Address of imaginary data array (size: _iCols * _iRows). This argument does not exist with createMatrixOfDouble and createNamedMatrixOfDouble.

SciErr

Error structure where is stored errors messages history and first error number.

Write directly in Scilab memory.

Calling Sequence

Input argument profile:

SciErr allocMatrixOfDouble(void* _pvCtx, int _iVar, int _iRows, int _iCols, double** _pdblReal)
SciErr allocComplexMatrixOfDouble(void* _pvCtx, int _iVar, int _iRows, int _iCols, double** _pdblReal, double** _pdblImg)
SciErr allocComplexZMatrixOfDouble(void* _pvCtx, int _iVar, int _iRows, int _iCols, double** _pdblReal, doublecomplex** _pdblData)

Arguments

_pvCtx

Scilab environment pointer, pass in "pvApiCtx" provided by api_scilab.h.

_iVar

Position in the Scilab memory where you want to put the variable.

_iRows

Number of rows of the new variable.

_iCols

Numbers of columns of the new variable.

_pdblReal

Returns address of real data array (size: _iCols * _iRows).

_pdblImg

Returns address of imaginary data array (size: _iCols * _iRows). This argument does not exist with allocMatrixOfDouble.

_pdblData

Returns address of doublecomplex data array (size: _iCols * _iRows). This argument exists only in allocComplexZMatrixOfDouble.

SciErr

Error structure where is stored errors messages history and first error number.

Gateway Source

#include "api_scilab.h"
int write_double(char *fname,unsigned long fname_len)
{
	SciErr sciErr;
	int i,j;
	//first variable info : real matrix of double 3 x 4
	int iRows1			= 3;
	int iCols1			= 4;
	double* pdblReal1	= NULL;
	//second variable info : complex matrix of double 4 x 6
	int iRows2			= 4;
	int iCols2			= 6;
	double* pdblReal2	= NULL;
	double* pdblImg2	= NULL;

	/************************
	*    First variable    *
	************************/

	//alloc array of data in OS memory
	pdblReal1 = (double*)malloc(sizeof(double) * iRows1 * iCols1);
	//fill array with incremental values
	//[ 0   1   2   3
	//  4   5   6   7
	//  8   9   10  11]
	for(i = 0 ; i < iRows1 ; i++)
	{
		for(j = 0 ; j < iCols1 ; j++)
		{
			pdblReal1[i + iRows1 * j] = i * iCols1 + j;
		}
	}

	//can be written in a single loop
	//for(i = 0 ; i < iRows1 * iCols1; i++)
	//{
	//  pdblReal1[i] = i;
	//}
	//create a variable from a existing data array

	sciErr = createMatrixOfDouble(pvApiCtx, nbInputArgument(pvApiCtx) + 1, iRows1, iCols1, pdblReal1);
	if(sciErr.iErr)
	{
		printError(&sciErr, 0);
		return 0;
	}
	//after creation, we can free memory.
	free(pdblReal1);

	
    /*************************
	*    Second variable    *
	*************************/

	//reserve space in scilab memory and fill it
	sciErr = allocComplexMatrixOfDouble(pvApiCtx, nbInputArgument(pvApiCtx) + 2, iRows2, iCols2, &pdblReal2, &pdblImg2);
	if(sciErr.iErr)
	{
		printError(&sciErr, 0);
		return 0;
	}

	//fill array with incremental values for real part and decremental for imaginary part
	//[ 23i     1+22i       2+21i       3+20i       4+19i       5+18i
	//  6+17i   7+16i       8+15i       9+14i       10+13i      11+12i
	//  12+11i  13+10i      14+9i       15+8i       16+7i       17+6i
	//  18+5i   19+4i       20+3i       21+2i       22+1i       23  ]
	for(i = 0 ; i < iRows2 ; i++)
	{
		for(j = 0 ; j < iCols2 ; j++)
		{
			pdblReal2[i + iRows2 * j] = i * iCols2 + j;
			pdblImg2 [i + iRows2 * j]	= (iRows2 * iCols2 - 1) - (i * iCols2 + j);
		}
	}

	//can be written in a single loop
	//for(i = 0 ; i < iRows2 * iCols2; i++)
	//{
	//  pdblReal2[i] = i;
	//  pdblImg2 [i] = (iRows2 * iCols2 - 1) - i;
	//}
	// /!\ DO NOT FREE MEMORY, in this case, it's the Scilab memory
	//assign allocated variables to Lhs position

    AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1;
    AssignOutputVariable(pvApiCtx, 2) = nbInputArgument(pvApiCtx) + 2;

    return 0;
}

Scilab test script

a_ref = [   0 1 2 3; ..
            4 5 6 7; ..
            8 9 10 11];
b_ref = [   23*%i,      1+22*%i,    2+21*%i,    3+20*%i,    4+19*%i,    5+18*%i; ..
            6+17*%i,    7+16*%i,    8+15*%i,    9+14*%i,     10+13*%i,  11+12*%i; ..
            12+11*%i,   13+10*%i,   14+9*%i,    15+8*%i,    16+7*%i,    17+6*%i; ..
            18+5*%i,    19+4*%i,    20+3*%i,    21+2*%i,    22+1*%i,    23];
[a,b] = write_double();
if or(a <> a_ref) then error("failed");end
if or(b <> b_ref) then error("failed");end
Scilab Enterprises
Copyright (c) 2011-2017 (Scilab Enterprises)
Copyright (c) 1989-2012 (INRIA)
Copyright (c) 1989-2007 (ENPC)
with contributors
Last updated:
Thu Oct 02 13:54:44 CEST 2014