be4311c07e14feb728abc6425ee606ffaa611a58 markd Fri Jan 22 06:46:58 2021 -0800 merge with master diff --git src/utils/matrixScale/matrixScale.c src/utils/matrixScale/matrixScale.c new file mode 100644 index 0000000..7a10bdf --- /dev/null +++ src/utils/matrixScale/matrixScale.c @@ -0,0 +1,76 @@ +/* matrixScale - Scale a matrix by a constant number.. */ +#include "common.h" +#include "linefile.h" +#include "hash.h" +#include "options.h" +#include "sqlNum.h" + +void usage() +/* Explain usage and exit. */ +{ +errAbort( + "matrixScale - Scale a matrix by a constant number.\n" + "usage:\n" + " matrixScale in.tsv scale out.tsv\n" + "where in and out are labeled matrices and scale is a floating point number\n" + "options:\n" + " -unlabeled - do scale first row or column\n" + ); +} + +/* Command line validation table. */ +static struct optionSpec options[] = { + {"unlabeled", OPTION_BOOLEAN}, + {NULL, 0}, +}; + +void matrixScale(char *input, char *scaleString, char *output) +/* matrixScale - Scale a matrix by a constant number.. */ +{ +boolean unlabeled = optionExists("unlabeled"); +double scale = sqlDouble(scaleString); +struct lineFile *lf = lineFileOpen(input, TRUE); +char *line; +FILE *f = mustOpen(output, "w"); +if (!unlabeled) + { + lineFileNeedNext(lf, &line, NULL); + fprintf(f, "%s\n", line); + } +while (lineFileNext(lf, &line, NULL)) + { + boolean first = TRUE; + char *word; + if (!unlabeled) + { + word = nextWord(&line); + fprintf(f, "%s", word); + first = FALSE; + } + while ((word = nextWord(&line)) != NULL) + { + if (!first) + fprintf(f, "\t"); + first = FALSE; + if (word[0] == '0' && word[1] == 0) // special case zero string */ + fprintf(f, "0"); + else + { + double val = sqlDouble(word); + fprintf(f, "%g", val*scale); + } + } + fprintf(f, "\n"); + } +carefulClose(&f); +} + +int main(int argc, char *argv[]) +/* Process command line. */ +{ +optionInit(&argc, argv, options); +if (argc != 4) + usage(); +matrixScale(argv[1], argv[2], argv[3]); +return 0; +}