/* --------------------------------------------------------- sort the rows so the row ids are in ascending order sort the columns so the column ids are in ascending order created -- 98may02, cca --------------------------------------------------------- */ void DenseMtx_sort ( DenseMtx *mtx ) { A2 a2 ; int ii, ncol, nrow, sortColumns, sortRows ; int *colind, *rowind ; /* ---------------- check the output ---------------- */ if ( mtx == NULL ) { fprintf(stderr, "\n fatal error in DenseMtx_sort(%p)" "\n bad input\n", mtx) ; spoolesFatal(); } DenseMtx_rowIndices(mtx, &nrow, &rowind) ; DenseMtx_columnIndices(mtx, &ncol, &colind) ; if ( nrow <= 0 || ncol <= 0 ) { return ; } sortRows = sortColumns = 0 ; for ( ii = 1 ; ii < nrow ; ii++ ) { if ( rowind[ii-1] > rowind[ii] ) { sortRows = 1 ; break ; } } for ( ii = 1 ; ii < ncol ; ii++ ) { if ( colind[ii-1] > colind[ii] ) { sortColumns = 1 ; break ; } } if ( sortRows == 0 && sortColumns == 0 ) { return ; } A2_setDefaultFields(&a2) ; DenseMtx_setA2(mtx, &a2) ; if ( sortRows == 1 ) { A2_sortRowsUp(&a2, nrow, rowind) ; } if ( sortColumns == 1 ) { A2_sortColumnsUp(&a2, ncol, colind) ; } return ; }
/* ----------------------------------------- permute the rows of the matrix A(*,*) = A(index(*),*) this method calls A2_sortRowsUp but does not overwrite the index[] vector created -- 98apr15, cca ----------------------------------------- */ void A2_permuteRows ( A2 *mtx, int nrow, int index[] ) { int *rowids ; /* --------------- check the input --------------- */ if ( mtx == NULL || nrow < 0 || nrow > mtx->n1 || index == NULL ) { fprintf(stderr, "\n fatal error in A2_permuteRows(%p,%d,%p)" "\n bad input\n", mtx, nrow, index) ; exit(-1) ; } rowids = IVinit(nrow, -1) ; IVcopy(nrow, rowids, index) ; A2_sortRowsUp(mtx, nrow, rowids) ; IVfree(rowids) ; return ; }