function nullspace_size = r8mat_nullspace_size ( m, n, a )
%*****************************************************************************80
%
%% r8mat_nullspace_size() computes the size of the nullspace of a matrix.
%
% Discussion:
%
% Let A be an MxN matrix.
%
% If X is an N-vector, and A*X = 0, then X is a null vector of A.
%
% The set of all null vectors of A is called the nullspace of A.
%
% The 0 vector is always in the null space.
%
% If the 0 vector is the only vector in the nullspace of A, then A
% is said to have maximum column rank. (Because A*X=0 can be regarded
% as a linear combination of the columns of A). In particular, if A
% is square, and has maximum column rank, it is nonsingular.
%
% The dimension of the nullspace is the number of linearly independent
% vectors that span the nullspace. If A has maximum column rank,
% its nullspace has dimension 0.
%
% This routine ESTIMATES the dimension of the nullspace. Cases of
% singularity that depend on exact arithmetic will probably be missed.
%
% The nullspace will be estimated by counting the leading 1's in the
% reduced row echelon form of A, and subtracting this from N.
%
% Licensing:
%
% This code is distributed under the GNU LGPL license.
%
% Modified:
%
% 15 April 2018
%
% Author:
%
% John Burkardt
%
% Input:
%
% integer M, N, the number of rows and columns of
% the matrix A.
%
% real A(M,N), the matrix to be analyzed.
%
% Output:
%
% integer NULLSPACE_SIZE, the estimated size of the nullspace.
%
%
% Get the reduced row echelon form of A.
%
[ a, det ] = r8mat_rref ( m, n, a );
%
% Count the leading 1's in A.
%
leading = 0;
for i = 1 : m
for j = 1 : n
if ( a(i,j) == 1.0 )
leading = leading + 1;
break
end
end
end
nullspace_size = n - leading;
return
end