+/** Compute the rank of this matrix. */
+unsigned matrix::rank() const
+{
+ // Method:
+ // Transform this matrix into upper echelon form and then count the
+ // number of non-zero rows.
+
+ GINAC_ASSERT(row*col==m.capacity());
+
+ // Actually, any elimination scheme will do since we are only
+ // interested in the echelon matrix' zeros.
+ matrix to_eliminate = *this;
+ to_eliminate.fraction_free_elimination();
+
+ unsigned r = row*col; // index of last non-zero element
+ while (r--) {
+ if (!to_eliminate.m[r].is_zero())
+ return 1+r/col;
+ }
+ return 0;
+}
+
+