#include "zbxalgo.h"
#include "zbxnum.h"
#define ZBX_MATH_EPSILON (1e-6)
#define ZBX_IS_NAN(x) ((x) != (x))
#define ZBX_VALID_MATRIX(m) (0 < (m)->rows && 0 < (m)->columns && NULL != (m)->elements)
#define ZBX_MATRIX_EL(m, row, col) ((m)->elements[(row) * (m)->columns + (col)])
#define ZBX_MATRIX_ROW(m, row) ((m)->elements + (row) * (m)->columns)
typedef struct
{
int rows;
int columns;
double *elements;
}
zbx_matrix_t;
static void zbx_matrix_struct_alloc(zbx_matrix_t **pm)
{
*pm = (zbx_matrix_t *)zbx_malloc(*pm, sizeof(zbx_matrix_t));
(*pm)->rows = 0;
(*pm)->columns = 0;
(*pm)->elements = NULL;
}
static int zbx_matrix_alloc(zbx_matrix_t *m, int rows, int columns)
{
if (0 >= rows || 0 >= columns)
goto error;
m->rows = rows;
m->columns = columns;
m->elements = (double *)zbx_malloc(m->elements, sizeof(double) * rows * columns);
return SUCCEED;
error:
THIS_SHOULD_NEVER_HAPPEN;
return FAIL;
}
static void zbx_matrix_free(zbx_matrix_t *m)
{
if (NULL != m)
zbx_free(m->elements);
zbx_free(m);
}
static int zbx_matrix_copy(zbx_matrix_t *dest, zbx_matrix_t *src)
{
if (!ZBX_VALID_MATRIX(src))
goto error;
if (SUCCEED != zbx_matrix_alloc(dest, src->rows, src->columns))
return FAIL;
memcpy(dest->elements, src->elements, sizeof(double) * src->rows * src->columns);
return SUCCEED;
error:
THIS_SHOULD_NEVER_HAPPEN;
return FAIL;
}
static int zbx_identity_matrix(zbx_matrix_t *m, int n)
{
if (SUCCEED != zbx_matrix_alloc(m, n, n))
return FAIL;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
ZBX_MATRIX_EL(m, i, j) = (i == j ? 1.0 : 0.0);