function [ row, col, b ] = r8gb_to_r8sp ( m, n, ml, mu, a, nz_num ) %*****************************************************************************80 % %% R8GB_TO_R8SP copies a R8GB matrix to a R8SP matrix. % % Discussion: % % The R8GB storage format is for an M by N banded matrix, with lower % bandwidth ML and upper bandwidth MU. Storage includes room for ML % extra superdiagonals, which may be required to store nonzero entries % generated during Gaussian elimination. % % The original M by N matrix is "collapsed" downward, so that diagonals % become rows of the storage array, while columns are preserved. The % collapsed array is logically 2*ML+MU+1 by N. % % LINPACK and LAPACK band storage requires that an extra ML % superdiagonals be supplied to allow for fillin during Gauss % elimination. Even though a band matrix is described as % having an upper bandwidth of MU, it effectively has an % upper bandwidth of MU+ML. This routine will copy nonzero % values it finds in these extra bands, so that both unfactored % and factored matrices can be handled. % % The R8SP storage format stores the row, column and value of each nonzero % entry of a sparse matrix. % % It is possible that a pair of indices (I,J) may occur more than % once. Presumably, in this case, the intent is that the actual value % of A(I,J) is the sum of all such entries. This is not a good thing % to do, but I seem to have come across this in MATLAB. % % The R8SP format is used by CSPARSE ("sparse triplet"), DLAP/SLAP % ("nonsymmetric SLAP triad"), by MATLAB, and by SPARSEKIT ("COO" format). % % Licensing: % % This code is distributed under the GNU LGPL license. % % Modified: % % 14 September 2006 % % Author: % % John Burkardt % % Parameters: % % Input, integer M, the number of rows of the matrices. % M must be positive. % % Input, integer N, the number of columns of the matrices. % N must be positive. % % Input, integer ML, MU, the lower and upper bandwidths of A1. % ML and MU must be nonnegative, and no greater than min(M,N)-1. % % Input, real A(2*ML+MU+1,N), the R8GB matrix. % % Input, integer NZ_NUM, the number of nonzero entries in A. % This number can be obtained by calling R8GB_NZ_NUM. % % Output, integer ROW(NZ_NUM), the row indices. % % Output, integer COL(NZ_NUM), the column indices. % % Output, real B(NZ_NUM), the R8SP matrix. % nz = 0; for i = 1 : m jlo = max ( 1, i - ml ); jhi = min ( n, i + mu + ml ); for j = jlo : jhi if ( a(ml+mu+1+i-j,j) == 0.0 ) continue; end if ( nz_num <= nz ) fprintf ( 1, '\n' ); fprintf ( 1, 'R8GB_TO_R8SP - Fatal error!\n' ); fprintf ( 1, ' NZ_NUM = %d\n', nz_num ); fprintf ( 1, ' But the matrix has more nonzeros than that!\n' ); error ( 'R8GB_TO_DS3 - Fatal error!' ); end nz = nz + 1; row(nz) = i; col(nz) = j; b(nz) = a(ml+mu+1+i-j,j); end end if ( nz < nz_num ) fprintf ( 1, '\n' ); fprintf ( 1, 'R8GB_TO_R8SP - Warning!\n' ); fprintf ( 1, ' NZ_NUM = %d\n', nz_num ); fprintf ( 1, ' But the number of nonzeros is %d\n', nz ); end return end