be4311c07e14feb728abc6425ee606ffaa611a58 markd Fri Jan 22 06:46:58 2021 -0800 merge with master diff --git src/lib/sparseMatrix.c src/lib/sparseMatrix.c new file mode 100644 index 0000000..aa15793 --- /dev/null +++ src/lib/sparseMatrix.c @@ -0,0 +1,88 @@ +#include "common.h" +#include "linefile.h" +#include "hash.h" +#include "localmem.h" +#include "obscure.h" +#include "sparseMatrix.h" + + +struct sparseRowMatrix *sparseRowMatrixNew(int xSize, int ySize) +/* Make up a new sparseRowMatrix structure */ +{ +struct sparseRowMatrix *matrix; +AllocVar(matrix); +matrix->xSize = xSize; +matrix->ySize = ySize; +matrix->lm = lmInit(0); +lmAllocArray(matrix->lm, matrix->rows, ySize); +return matrix; +} + +void sparseRowMatrixFree(struct sparseRowMatrix **pMatrix) +/* Free up resources associated with sparse matrix */ +{ +struct sparseRowMatrix *matrix = *pMatrix; +if (matrix != NULL) + { + lmCleanup(&matrix->lm); + freez(pMatrix); + } +} + +void sparseRowMatrixAdd(struct sparseRowMatrix *matrix, int x, int y, float val) +/* Add data to our sparse matrix */ +{ +struct sparseRowVal *fv; +lmAllocVar(matrix->lm, fv); +fv->x = x; +fv->val = val; +slAddHead(&matrix->rows[y], fv); +} + +void sparseRowMatrixUnpackRow(struct sparseRowMatrix *matrix, int y, double *row, int rowSize) +/* Unpack sparse matrix into buf that should be matrix->xSize long */ +{ +if (matrix->xSize != rowSize) + errAbort("sparseRowMatrixUnpackRow size mismatch %d vs %d", matrix->xSize, rowSize); +int bufSize = matrix->xSize * sizeof(double); +zeroBytes(row, bufSize); +struct sparseRowVal *fv; +for (fv = matrix->rows[y]; fv != NULL; fv = fv->next) + row[fv->x] = fv->val; +} + +static void sparseRowMatrixTsvBody(struct sparseRowMatrix *matrix, char **rowLabels, FILE *f) +/* Write body (but not header) of matrix to tsv file */ +{ +int xSize = matrix->xSize; +int ySize = matrix->ySize; +int x,y; +double row[xSize]; +for (y=0; yySize); +fprintf(f, "gene\t"); +writeTsvRow(f, matrix->xSize, columnLabels); +sparseRowMatrixTsvBody(matrix, rowLabels, f); +carefulClose(&f); +} +