--- ray/src/util/rmtxop.c 2015/07/22 04:47:51 2.8 +++ ray/src/util/rmtxop.c 2018/08/27 23:03:05 2.12 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: rmtxop.c,v 2.8 2015/07/22 04:47:51 greg Exp $"; +static const char RCSid[] = "$Id: rmtxop.c,v 2.12 2018/08/27 23:03:05 greg Exp $"; #endif /* * General component matrix operations. @@ -7,9 +7,11 @@ static const char RCSid[] = "$Id: rmtxop.c,v 2.8 2015/ #include #include +#include #include "rtio.h" #include "resolu.h" #include "rmatrix.h" +#include "platform.h" #define MAXCOMP 50 /* #components we support */ @@ -28,7 +30,7 @@ static void op_default(ROPERAT *op) { memset(op, 0, sizeof(ROPERAT)); - op->op = '*'; + op->op = '.'; } static RMATRIX * @@ -45,21 +47,6 @@ operate(RMATRIX *mleft, ROPERAT *op, const char *fname fputs(": cannot load matrix\n", stderr); return(NULL); } - if (op->transpose) { /* transpose matrix? */ - mtmp = rmx_transpose(mright); - if (mtmp == NULL) { - fputs(fname, stderr); - fputs(": transpose failed\n", stderr); - rmx_free(mright); - return(NULL); - } - if (verbose) { - fputs(fname, stderr); - fputs(": transposed rows and columns\n", stderr); - } - rmx_free(mright); - mright = mtmp; - } if (op->nsf > 0) { /* apply scalar(s) */ if (op->clen > 0) { fputs("Options -s and -c are exclusive\n", stderr); @@ -109,9 +96,24 @@ operate(RMATRIX *mleft, ROPERAT *op, const char *fname rmx_free(mright); mright = mtmp; } + if (op->transpose) { /* transpose matrix? */ + mtmp = rmx_transpose(mright); + if (mtmp == NULL) { + fputs(fname, stderr); + fputs(": transpose failed\n", stderr); + rmx_free(mright); + return(NULL); + } + if (verbose) { + fputs(fname, stderr); + fputs(": transposed rows and columns\n", stderr); + } + rmx_free(mright); + mright = mtmp; + } if (mleft == NULL) /* just one matrix */ return(mright); - if (op->op == '*') { /* concatenate */ + if (op->op == '.') { /* concatenate */ RMATRIX *mres = rmx_multiply(mleft, mright); if (mres == NULL) { fputs(fname, stderr); @@ -142,6 +144,23 @@ operate(RMATRIX *mleft, ROPERAT *op, const char *fname fputs(": added in matrix\n", stderr); } rmx_free(mright); + } else if ((op->op == '*') | (op->op == '/')) { + const char * tnam = (op->op == '/') ? + "division" : "multiplication"; + errno = 0; + if (!rmx_elemult(mleft, mright, (op->op == '/'))) { + fprintf(stderr, "%s: element-wise %s failed\n", + fname, tnam); + rmx_free(mright); + return(NULL); + } + if (errno) + fprintf(stderr, + "%s: warning - error during element-wise %s\n", + fname, tnam); + else if (verbose) + fprintf(stderr, "%s: element-wise %s\n", fname, tnam); + rmx_free(mright); } else { fprintf(stderr, "%s: unknown operation '%c'\n", fname, op->op); rmx_free(mright); @@ -172,8 +191,9 @@ main(int argc, char *argv[]) op_default(&op); /* get options and arguments */ for (i = 1; i < argc; i++) - if (argv[i][0] == '+' && !argv[i][1]) { - op.op = '+'; + if (argv[i][0] && !argv[i][1] && + strchr("+*/", argv[i][0]) != NULL) { + op.op = argv[i][0]; } else if (argv[i][0] != '-' || !argv[i][1]) { char *fname = NULL; /* load matrix */ if (argv[i][0] != '-') @@ -233,10 +253,8 @@ main(int argc, char *argv[]) /* write result to stdout */ if (outfmt == DTfromHeader) outfmt = mres->dtype; -#ifdef _WIN32 if (outfmt != DTascii) - _setmode(fileno(stdout), _O_BINARY); -#endif + SET_FILE_BINARY(stdout); newheader("RADIANCE", stdout); printargs(argc, argv, stdout); if (!rmx_write(mres, outfmt, stdout)) { @@ -247,7 +265,7 @@ main(int argc, char *argv[]) return(0); userr: fprintf(stderr, - "Usage: %s [-v][-f[adfc][-t][-s sf .. | -c ce ..] m1 [+] .. > mres\n", + "Usage: %s [-v][-f[adfc][-t][-s sf .. | -c ce ..] m1 [+*/] .. > mres\n", argv[0]); return(1); }