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.87 by greg, Fri Apr 4 01:48:25 2025 UTC

# Line 707 | Line 707 | rmx_transfer_data(RMATRIX *rdst, RMATRIX *rsrc, int do
707          return(1);
708   }
709  
710 < /* Allocate and assign transposed matrix */
711 < RMATRIX *
712 < rmx_transpose(const RMATRIX *rm)
710 > /* Transpose the given matrix */
711 > int
712 > rmx_transpose(RMATRIX *rm)
713   {
714 <        RMATRIX *dnew;
714 >        RMATRIX dnew;
715          int     i, j;
716  
717 <        if (!rm || !rm->mtx)
717 >        if (!rm || !rm->mtx | (rm->ncomp > MAXCOMP))
718                  return(0);
719 <        if ((rm->nrows == 1) | (rm->ncols == 1)) {
720 <                dnew = rmx_copy(rm);
721 <                if (!dnew)
722 <                        return(NULL);
723 <                dnew->nrows = rm->ncols;
724 <                dnew->ncols = rm->nrows;
725 <                return(dnew);
719 >        if (rm->info)
720 >                rmx_addinfo(rm, "Transposed rows and columns\n");
721 >        if ((rm->nrows == 1) | (rm->ncols == 1)) { /* vector? */
722 >                j = rm->ncols;
723 >                rm->ncols = rm->nrows;
724 >                rm->nrows = j;
725 >                return(1);
726          }
727 <        dnew = rmx_alloc(rm->ncols, rm->nrows, rm->ncomp);
728 <        if (!dnew)
729 <                return(NULL);
730 <        if (rm->info) {
731 <                rmx_addinfo(dnew, rm->info);
732 <                rmx_addinfo(dnew, "Transposed rows and columns\n");
727 >        if (rm->nrows == rm->ncols) {   /* square matrix case */
728 >                rmx_dtype       val[MAXCOMP];
729 >                for (j = rm->ncols; j--; )
730 >                    for (i = rm->nrows; i--; ) {
731 >                        if (i == j) continue;
732 >                        memcpy(val, rmx_val(rm,i,j),
733 >                                sizeof(rmx_dtype)*rm->ncomp);
734 >                        memcpy(rmx_lval(rm,i,j), rmx_val(rm,j,i),
735 >                                sizeof(rmx_dtype)*rm->ncomp);
736 >                        memcpy(rmx_val(rm,j,i), val,
737 >                                sizeof(rmx_dtype)*rm->ncomp);
738 >                    }
739 >                return(1);
740          }
741 <        dnew->dtype = rm->dtype;
742 <        copycolor(dnew->cexp, rm->cexp);
743 <        memcpy(dnew->wlpart, rm->wlpart, sizeof(dnew->wlpart));
744 <        for (j = dnew->ncols; j--; )
745 <            for (i = dnew->nrows; i--; )
746 <                memcpy(rmx_lval(dnew,i,j), rmx_val(rm,j,i),
747 <                                sizeof(rmx_dtype)*dnew->ncomp);
748 <        return(dnew);
741 >        memset(&dnew, 0, sizeof(dnew));
742 >        dnew.ncols = rm->nrows; dnew.nrows = rm->ncols;
743 >        dnew.ncomp = rm->ncomp;
744 >        if (!rmx_prepare(&dnew))
745 >                return(0);
746 >        rmx_addinfo(&dnew, rm->info);
747 >        dnew.dtype = rm->dtype;
748 >        copycolor(dnew.cexp, rm->cexp);
749 >        memcpy(dnew.wlpart, rm->wlpart, sizeof(dnew.wlpart));
750 >        for (j = dnew.ncols; j--; )
751 >            for (i = dnew.nrows; i--; )
752 >                memcpy(rmx_lval(&dnew,i,j), rmx_val(rm,j,i),
753 >                                sizeof(rmx_dtype)*dnew.ncomp);
754 >        rmx_reset(rm);                  /* frees memory */
755 >        *rm = dnew;                     /* replace w/ transpose */
756 >        return(1);
757   }
758  
759   /* Multiply (concatenate) two matrices and allocate the result */

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines