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.86 by greg, Fri Mar 28 00:06:36 2025 UTC vs.
Revision 2.88 by greg, Fri Apr 4 02:53:03 2025 UTC

# Line 680 | Line 680 | rmx_copy(const RMATRIX *rm)
680   int
681   rmx_transfer_data(RMATRIX *rdst, RMATRIX *rsrc, int dometa)
682   {
683 <        if (!rdst | !rsrc || (rdst->nrows != rsrc->nrows) |
684 <                        (rdst->ncols != rsrc->ncols) |
685 <                        (rdst->ncomp != rsrc->ncomp))
683 >        if (!rdst | !rsrc)
684                  return(0);
687
685          if (dometa) {           /* transfer everything? */
686                  rmx_reset(rdst);
687                  *rdst = *rsrc;
688                  rsrc->info = NULL; rsrc->mapped = NULL; rsrc->mtx = NULL;
689                  return(1);
690          }
691 < #ifdef MAP_FILE                 /* just matrix data -- leave metadata */
691 >                                /* just matrix data -- leave metadata */
692 >        if ((rdst->nrows != rsrc->nrows) |
693 >                        (rdst->ncols != rsrc->ncols) |
694 >                        (rdst->ncomp != rsrc->ncomp))
695 >                return(0);
696 > #ifdef MAP_FILE
697          if (rdst->mapped)
698                  munmap(rdst->mapped, rmx_mapped_size(rdst));
699          else
# Line 707 | Line 709 | rmx_transfer_data(RMATRIX *rdst, RMATRIX *rsrc, int do
709          return(1);
710   }
711  
712 < /* Allocate and assign transposed matrix */
713 < RMATRIX *
714 < rmx_transpose(const RMATRIX *rm)
712 > /* Transpose the given matrix */
713 > int
714 > rmx_transpose(RMATRIX *rm)
715   {
716 <        RMATRIX *dnew;
716 >        RMATRIX dnew;
717          int     i, j;
718  
719 <        if (!rm || !rm->mtx)
719 >        if (!rm || !rm->mtx | (rm->ncomp > MAXCOMP))
720                  return(0);
721 <        if ((rm->nrows == 1) | (rm->ncols == 1)) {
722 <                dnew = rmx_copy(rm);
723 <                if (!dnew)
724 <                        return(NULL);
725 <                dnew->nrows = rm->ncols;
726 <                dnew->ncols = rm->nrows;
727 <                return(dnew);
721 >        if (rm->info)
722 >                rmx_addinfo(rm, "Transposed rows and columns\n");
723 >        if ((rm->nrows == 1) | (rm->ncols == 1)) { /* vector? */
724 >                j = rm->ncols;
725 >                rm->ncols = rm->nrows;
726 >                rm->nrows = j;
727 >                return(1);
728          }
729 <        dnew = rmx_alloc(rm->ncols, rm->nrows, rm->ncomp);
730 <        if (!dnew)
731 <                return(NULL);
732 <        if (rm->info) {
733 <                rmx_addinfo(dnew, rm->info);
734 <                rmx_addinfo(dnew, "Transposed rows and columns\n");
729 >        if (rm->nrows == rm->ncols) {   /* square matrix case */
730 >                rmx_dtype       val[MAXCOMP];
731 >                for (j = rm->ncols; j--; )
732 >                    for (i = rm->nrows; i--; ) {
733 >                        if (i == j) continue;
734 >                        memcpy(val, rmx_val(rm,i,j),
735 >                                sizeof(rmx_dtype)*rm->ncomp);
736 >                        memcpy(rmx_lval(rm,i,j), rmx_val(rm,j,i),
737 >                                sizeof(rmx_dtype)*rm->ncomp);
738 >                        memcpy(rmx_val(rm,j,i), val,
739 >                                sizeof(rmx_dtype)*rm->ncomp);
740 >                    }
741 >                return(1);
742          }
743 <        dnew->dtype = rm->dtype;
744 <        copycolor(dnew->cexp, rm->cexp);
745 <        memcpy(dnew->wlpart, rm->wlpart, sizeof(dnew->wlpart));
746 <        for (j = dnew->ncols; j--; )
747 <            for (i = dnew->nrows; i--; )
748 <                memcpy(rmx_lval(dnew,i,j), rmx_val(rm,j,i),
749 <                                sizeof(rmx_dtype)*dnew->ncomp);
750 <        return(dnew);
743 >        memset(&dnew, 0, sizeof(dnew));
744 >        dnew.ncols = rm->nrows; dnew.nrows = rm->ncols;
745 >        dnew.ncomp = rm->ncomp;
746 >        if (!rmx_prepare(&dnew))
747 >                return(0);
748 >        rmx_addinfo(&dnew, rm->info);
749 >        dnew.dtype = rm->dtype;
750 >        copycolor(dnew.cexp, rm->cexp);
751 >        memcpy(dnew.wlpart, rm->wlpart, sizeof(dnew.wlpart));
752 >        for (j = dnew.ncols; j--; )
753 >            for (i = dnew.nrows; i--; )
754 >                memcpy(rmx_lval(&dnew,i,j), rmx_val(rm,j,i),
755 >                                sizeof(rmx_dtype)*dnew.ncomp);
756 >                                        /* and reassign result */
757 >        return(rmx_transfer_data(rm, &dnew, 1));
758   }
759  
760   /* Multiply (concatenate) two matrices and allocate the result */

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines