function a = i4mat_perm2 ( m, n, a, p, q )

%*****************************************************************************80
%
%% i4mat_perm2() permutes the rows and columns of a rectangular I4MAT.
%
%  Licensing:
%
%    This code is distributed under the MIT license.
%
%  Modified:
%
%    24 May 2015
%
%  Author:
%
%    John Burkardt.
%
%  Reference:
%
%    A Nijenhuis, H Wilf,
%    Combinatorial Algorithms,
%    Academic Press, 1978, second edition,
%    ISBN 0-12-519260-6.
%
%  Input:
%
%    integer M, number of rows in the matrix.
%
%    integer N, number of columns in the matrix.
%
%    integer A(M,N), the matrix to be permuted.
%
%    integer P(M), the row permutation.  P(I) is the new number of row I.
%
%    integer Q(N), the column permutation.  Q(I) is the new number of
%    column I.  
%
%  Output:
%
%    integer A(M,N), the permuted matrix.
%
  ierror = perm1_check ( m, p );

  if ( ierror ~= 0 )
    fprintf ( 1, '\n' );
    fprintf ( 1, 'I4MAT_PERM2 - Fatal error!\n' );
    fprintf ( 1, '  PERM1_CHECK says permutation is illegal.\n' );
    error ( 'I4MAT_PERM2 - Fatal error!' );
  end

  p = perm_cycle ( m, p, is, nc, 1 );

  ierror = perm1_check ( n, q );

  if ( ierror ~= 0 )
    fprintf ( 1, '\n' );
    fprintf ( 1, 'I4MAT_PERM2 - Fatal error!\n' );
    fprintf ( 1, '  PERM1_CHECK says permutation is illegal.\n' );
    error ( 'I4MAT_PERM2 - Fatal error!' );
  end

  q = perm_cycle ( n, q, is, nc, 1 );

  for i = 1 : m

    i1 = -p(i);

    if ( 0 < i1 )

      lc = 0;

      while ( true )

        i1 = p(i1);
        lc = lc + 1;

        if ( i1 <= 0 )
          break
        end

      end

      i1 = i;

      for j = 1 : n

        if ( q(j) <= 0 )

          j2 = j;
          k = lc;

          while ( true )

            j1 = j2;
            it = a(i1,j1);

            while ( true )

              i1 = abs ( p(i1) );
              j1 = abs ( q(j1) );

              temp = it;
              it = a(i1,j1);
              a(i1,j1) = temp;

              if ( j1 ~= j2 )
                continue
              end

              k = k - 1;

              if ( i1 == i )
                continue
              end

            end

            j2 = abs ( q(j2) );

            if ( k == 0 )
              break
            end

          end

        end

      end

    end

  end
%
%  Restore the positive signs of the data.
%
  p(1:m) = abs ( p(1:m) );

  if ( q(1) <= 0 )
    q(1:n) = abs ( q(1:n) );
  end

  return
end

