Boolean sparse writing (Scilab gateway) (original) (raw)

Scilab 5.3.3

Please note that the recommended version of Scilab is 2026.0.1. This page might be outdated.
However, this page did not exist in the previous stable version.

Scilab help >> API Scilab > Low level functions > Boolean sparse writing (Scilab gateway)

How to add boolean sparse matrix in a gateway.

Calling Sequence

Input argument profile:

SciErr createBooleanSparseMatrix(void* _pvCtx, int _iVar, int _iRows, int _iCols, int _iNbItem, const int* _piNbItemRow, const int* _piColPos)

Named variable profile:

SciErr createNamedBooleanSparseMatrix(void* _pvCtx, const char* _pstName, int _iRows, int _iCols, int _iNbItem, const int* _piNbItemRow, const int* _piColPos)

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

Number of columns of the new variable.

_iNbItem

Number of non zero itmes in the sparse.

_piNbItemRow

Number of item in each rows (size: _iRows).

_piColPos

Column position for each item (size: _iNbItem).

SciErr

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

Write directly in Scilab memory.

Calling Sequence

Input argument profile:

SciErr allocBooleanSparseMatrix(void* _pvCtx, int _iVar, int _iRows, int _iCols, int _iNbItem, int** _piNbItemRow, int** _piColPos)

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

Number of columns of the new variable.

_iNbItem

Number of non zero itmes in the sparse.

_piNbItemRow

Number of item in each rows (size: _iRows).

_piColPos

Column position for each item (size: _iNbItem).

SciErr

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

Description

This help describes how to add boolean sparse matrix in a list.

Gateway Source

int read_write_bsparse(char *fname,unsigned long fname_len) { SciErr sciErr; int i = 0; int j = 0; int k = 0;

int iRows               = 0;
int iCols               = 0;
int *piAddr             = NULL;
int iNbItem             = 0;
int* piNbItemRow        = NULL;
int* piColPos           = NULL;

int iCol                = 0;
int iNewCol             = 0;

int iNewItem            = 0;
int* piNewRow           = NULL;
int* piNewCol           = NULL;


CheckRhs(1,1);
CheckLhs(1,1);


sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
if(sciErr.iErr)
{
    printError(&sciErr, 0);
    return 0;
}


sciErr = getBooleanSparseMatrix(pvApiCtx, piAddr, &iRows, &iCols, &iNbItem, &piNbItemRow, &piColPos);
if(sciErr.iErr)
{
    printError(&sciErr, 0);
    return 0;
}


iNewItem = (iRows * iCols) - iNbItem;
piNewRow = (int*)MALLOC(sizeof(int) * iRows);
piNewCol = (int*)MALLOC(sizeof(int) * iNewItem);

for(i = 0 ; i < iRows ; i++)
{
    piNewRow[i] = iCols - piNbItemRow[i];
    for(j = 0 ; j < iCols ; j++)
    {
        int iFind = 0;
        for(k = 0 ; k < piNbItemRow[i] ; k++)
        {
            if(piColPos[iCol + k] == (j + 1))
            {
                iFind = 1;
                break;
            }
        }
        if(iFind == 0)
        {
            piNewCol[iNewCol++] = (j + 1);
        }
    }
    iCol += piNbItemRow[i];
}

sciErr = createBooleanSparseMatrix(pvApiCtx, Rhs + 1, iRows, iCols, iNewItem, piNewRow, piNewCol);
if(sciErr.iErr)
{
    printError(&sciErr, 0);
    return 0;
}

LhsVar(1) = Rhs + 1;
return 0;

}

Scilab test script

a = sparse([%t, %f, %t ; %f, %t, %f ; %t, %f, %t]); a_ref = sparse([%f, %t, %f ; %t, %f, %t ; %f, %t, %f]);

b = read_write_bsparse(a); if or(b <> a_ref) then error("failed");end