30#include "legacymatrix2d.h"
47static void emxInit_real_T(Matrix2D** pMatrix,
int dimensions)
58 *pMatrix = (Matrix2D*) malloc(
sizeof(Matrix2D));
59 Matrix2D* matrix = *pMatrix;
63 matrix->data =
nullptr;
64 matrix->numDimensions = dimensions;
65 matrix->size = (
int*) malloc(
sizeof(
int) * dimensions);
66 matrix->allocatedSize = 0;
67 matrix->canFreeData =
true;
69 for (
int i = 0; i < dimensions; i++)
73static void emxFree_real_T(Matrix2D** pMatrix)
78 auto matrix = *pMatrix;
82 if (matrix->canFreeData)
91static void emxEnsureCapacity(Matrix2D* matrix,
int oldNumel,
size_t elementSize)
102 for (
int i = 0; i < matrix->numDimensions; i++)
103 newNumel *= matrix->size[i];
105 if (newNumel <= matrix->allocatedSize)
108 int newSize = matrix->allocatedSize;
112 while (newSize < newNumel)
114 if (newSize > 1073741823)
116 newSize = 2147483647;
124 newData = (
double*) calloc(newSize, elementSize);
127 memcpy(newData, matrix->data, elementSize * oldNumel);
128 if (matrix->canFreeData)
132 matrix->data = newData;
133 matrix->allocatedSize = newSize;
134 matrix->canFreeData =
true;
137Matrix2D* Matrix2D_Create()
140 emxInit_real_T(&matrix, 2);
144void Matrix2D_Delete(Matrix2D** matrix)
146 emxFree_real_T(matrix);
149void Matrix2D_SetDimensions(Matrix2D* matrix,
int rows,
int columns)
151 int size = matrix->size[0] * matrix->size[1];
152 matrix->size[0] = rows;
153 matrix->size[1] = columns;
154 emxEnsureCapacity(matrix, size,
sizeof(
double));
157int Matrix2D_GetDimension(
const Matrix2D* matrix,
int dimension)
160 if (matrix->numDimensions >= dimension)
162 return matrix->size[dimension - 1];
170int Matrix2D_ColumnCount(
const Matrix2D* matrix)
172 return Matrix2D_GetDimension(matrix, 2);
175int Matrix2D_RowCount(
const Matrix2D* matrix)
177 return Matrix2D_GetDimension(matrix, 1);
180double Matrix2D_Get(
const Matrix2D* matrix,
int row,
int column)
183 return matrix->data[matrix->size[0] * column + row];
186void Matrix2D_Set(
const Matrix2D* matrix,
int row,
int column,
double value)
189 matrix->data[matrix->size[0] * column + row] = value;
192double* Matrix2D_GetColumn(
const Matrix2D* matrix,
int column)
195 return (matrix->data + matrix->size[0] * column);
198bool Matrix2D_Copy(
const Matrix2D* source, Matrix2D* destination)
200 if (source->numDimensions != 2 || destination->numDimensions != 2)
202 Matrix2D_SetDimensions(destination, 0, 0);
206 int sz1 = Matrix2D_GetDimension(source, 1);
207 int sz2 = Matrix2D_GetDimension(source, 2);
208 Matrix2D_SetDimensions(destination, sz1, sz2);
209 int numel = sz1 * sz2;
210 for (
int i = 0; i < numel; i++)
212 destination->data[i] = source->data[i];
219void Matrix2D_DebugArray(
const double *array,
int size)
223 for (i = 0; i < size; i++) {
224 strout.append(QString::number(array[i],
'f', 3));
226 strout.append(
" , ");
229 qDebug().noquote() << strout;
232void Matrix2D_Debug(
const Matrix2D* matrix)
238 size1 = Matrix2D_RowCount(matrix);
239 size2 = Matrix2D_ColumnCount(matrix);
240 qDebug().noquote() <<
"Matrix size = " << size1 <<
" x " << size2;
241 if (size1*size2 == 0)
245 for (j = 0; j<size2; j++)
247 column = Matrix2D_GetColumn(matrix, j);
248 Matrix2D_DebugArray(column, size1);
252void Matrix2D_Save(QTextStream *stream, Matrix2D* matrix,
bool csv)
258 size1 = Matrix2D_RowCount(matrix);
259 size2 = Matrix2D_ColumnCount(matrix);
261 if (size1 * size2 == 0)
268 for (j = 0; j<size2; j++)
270 column = Matrix2D_GetColumn(matrix, j);
271 for (
int i = 0; i < size1; i++)
273 *stream << QString::number(column[i],
'f', 8) <<
", ";
280 for (j = 0; j<size2; j++)
282 column = Matrix2D_GetColumn(matrix, j);
284 for (
int i = 0; i < size1; i++)
286 *stream << QString::number(column[i],
'f', 8) <<
" ";
293void Matrix2D_Save(QDataStream* stream, Matrix2D* matrix)
296 *stream << matrix->numDimensions;
298 for (i = 0; i < matrix->numDimensions; i++)
300 qint32 sizei = matrix->size[i];
301 size_values = size_values * sizei;
304 for (i = 0; i < size_values; i++)
306 *stream << matrix->data[i];
310void Matrix2D_Load(QDataStream *stream, Matrix2D** matrix)
314 qDebug() <<
"No data to read";
318 if (*matrix !=
nullptr)
320 Matrix2D_Delete(matrix);
327 qDebug() <<
"Loading matrix of dimensions: " << ndim;
328 emxInit_real_T(matrix, ndim);
330 for (i = 0; i < ndim; i++)
333 size_values = size_values * sizei;
334 (*matrix)->size[i] = sizei;
337 emxEnsureCapacity(*matrix, 0,
sizeof(
double));
339 for (i = 0; i < size_values; i++)
342 (*matrix)->data[i] = value;