ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/util/rmatrix.c
(Generate patch)

Comparing ray/src/util/rmatrix.c (file contents):
Revision 2.24 by greg, Tue Aug 30 15:11:22 2016 UTC vs.
Revision 2.25 by greg, Mon Aug 28 15:59:46 2017 UTC

# Line 9 | Line 9 | static const char RCSid[] = "$Id$";
9   #include <stdlib.h>
10   #include <string.h>
11   #include <fcntl.h>
12 + #include <errno.h>
13   #include "rtio.h"
14   #include "platform.h"
15   #include "resolu.h"
# Line 520 | Line 521 | rmx_multiply(const RMATRIX *m1, const RMATRIX *m2)
521                      rmx_lval(mres,i,j,k) = (double)d;
522                  }
523          return(mres);
524 + }
525 +
526 + /* Element-wise multiplication (or division) of m2 into m1 */
527 + int
528 + rmx_elemult(RMATRIX *m1, const RMATRIX *m2, int divide)
529 + {
530 +        int     zeroDivides = 0;
531 +        int     i, j, k;
532 +
533 +        if ((m1 == NULL) | (m2 == NULL) ||
534 +                        (m1->ncols != m2->ncols) | (m1->nrows != m2->nrows))
535 +                return(0);
536 +        if ((m2->ncomp > 1) & (m2->ncomp != m1->ncomp))
537 +                return(0);
538 +        i = rmx_newtype(m1->dtype, m2->dtype);
539 +        if (i)
540 +                m1->dtype = i;
541 +        else
542 +                rmx_addinfo(m1, rmx_mismatch_warn);
543 +        for (i = m1->nrows; i--; )
544 +            for (j = m1->ncols; j--; )
545 +                if (divide) {
546 +                    double      d;
547 +                    if (m2->ncomp == 1) {
548 +                        d = rmx_lval(m2,i,j,0);
549 +                        if (d == 0) {
550 +                            ++zeroDivides;
551 +                            for (k = m1->ncomp; k--; )
552 +                                rmx_lval(m1,i,j,k) = 0;
553 +                        } else {
554 +                            d = 1./d;
555 +                            for (k = m1->ncomp; k--; )
556 +                                rmx_lval(m1,i,j,k) *= d;
557 +                        }
558 +                    } else
559 +                        for (k = m1->ncomp; k--; ) {
560 +                            d = rmx_lval(m2,i,j,k);
561 +                            if (d == 0) {
562 +                                ++zeroDivides;
563 +                                rmx_lval(m1,i,j,k) = 0;
564 +                            } else
565 +                                rmx_lval(m1,i,j,k) /= d;
566 +                        }
567 +                } else {
568 +                    if (m2->ncomp == 1) {
569 +                        const double    d = rmx_lval(m2,i,j,0);
570 +                        for (k = m1->ncomp; k--; )
571 +                            rmx_lval(m1,i,j,k) *= d;
572 +                    } else
573 +                        for (k = m1->ncomp; k--; )
574 +                            rmx_lval(m1,i,j,k) *= rmx_lval(m2,i,j,k);
575 +                }
576 +        if (zeroDivides) {
577 +                fputs("Divide by zero in rmx_elemult()\n", stderr);
578 +                errno = ERANGE;
579 +        }
580 +        return(1);
581   }
582  
583   /* Sum second matrix into first, applying scale factor beforehand */

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines