Mathematica Stack Exchange is a question and answer site for users of Mathematica. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I'd like to invoke RowReduce on some matrices with a time parameter.

For example consider

A = {{1, 0}, {0, t}}

If t = 0, we have

RowReduce[A /. t -> 0] = {{1, 0}, {0, 0}}

but RowReduce[A] always returns the identity matrix.

How can I tell Mathematica to distinguish cases where there might be division by zero?

Edit: Maybe I need to clarify my problem a bit more. I don't know much about the matrices, except that they contain some time dependence. Now, whatever form the given matrix has, I want to perform some operation to attain a (time-depending) row-echelon form of my matrix that is valid for all $t \in I\subseteq\mathbb{R}$.

share|improve this question
Cannot do this directly using RowReduce. But Reduce, as below, can give similar information. Reduce[A.{x, y} == {z, w}] Out[16]= x == z && ((y != 0 && t == w/y) || (y == 0 && w == 0)) – Daniel Lichtblau Jul 29 '13 at 13:52
To take up your point. I think this might solve the problem, but implementation would be really ugly, because I don't want to solve a linear system. – user8774 Jul 30 '13 at 14:33

This problem is discussed in the "Handbook of Linear Algebra" book:

When standard linear algebra methods are applied to matrices containing symbolic entries, the user must be aware of new mathematical features that can arise. The main feature is the discontinuity of standard matrix functions, such as the reduced row-echelon form and the rank, both of which can be discontinuous. [...] The recommended solution is to use Turing factoring (generalized PLU decomposition) to obtain the reduced row-echelon form with provisos.

I don't think that the "Turing factorization of rectangular matrix" is implemented in Mathematica (it seems to be the case for Maple and Matlab). You can always settle on a upper-triangular form from the plain LU decomposition, which does not make assumptions such as those made by the RowReduce function:

m = {{aa, bb}, {cc, dd}};
n = Length[m] (* == Length[Transpose[m]]*)
{lu, p, c} = LUDecomposition[m];
(u = lu  SparseArray[{i_, j_} /; j >= i -> 1, {n, n}]) // TableForm

(* sanity check *)
l = lu SparseArray[{i_, j_} /; j < i -> 1, {n, n}] + IdentityMatrix[n];
m[[p]] == l.u

NB: a very similar question was already asked here (duplicate?).

share|improve this answer
hmm, I did see the question, but I don't see the point. Again, aa is assumed to be not zero, or not? – user8774 Jul 29 '13 at 16:09
LUDecomposition is indeed making the tacit assumption that aa is invertible. – Daniel Lichtblau Jul 29 '13 at 20:09
True, in this example LUDecomposition assumes existence of the element which is an inverse of aa. The difference with respect to RowReduce is that you get to still do symbolic computations and correctly evaluate reduced matrix at different points, including those for which it may pose problems. E.g. u /. {aa -> 0} gives a fair answer here. – trybik Jul 30 '13 at 13:10
"Correctly" is an overstatement -LUDecomposition[m /. {aa -> 0}]] is well defined. – trybik Jul 30 '13 at 13:24

I believe this is a case where Mathematica is giving a generic answer: for all t!=0, the proper answer is indeed the 2 by 2 identity, but for the specific value t=0, you get the specific solution. So one way to distinguish these is to do a test of the matrix rank and then proceed accordingly. For the test case,

a = {{1, 0}, {0, t}};

gives 2 but

MatrixRank[a /. t -> 0]

gives 1. More generally, say the matrix has a function of t:

a = {{1, 0}, {0, f[t]}};

Then one can similarly test using

MatrixRank[a /. f[t] -> 0]

The first returns 2 and the second gives 1.

share|improve this answer
Well, but how to do this test if expression gets more complex? For example if we have instead of t t^2 -2? – user8774 Jul 29 '13 at 14:56
Okay, now this works for this special case. But if we replace the zeros by ones, we would have to test whether t=1. – user8774 Jul 29 '13 at 15:19
I think you need to clarify what problem you want solved: the above answers the two questions you asked. – bill s Jul 29 '13 at 15:28

If you "don't know much about matrices" the Presentations Application, which I sell through my web site, has a Student's Linear Equation section that allows one to manipulate matrix structures step by step using various basic matrix operations. One can compose matrix structures, operate on them, print them and there is also a palette display from which one can paste positions. One can also display the matrices in equation form. Linear programming operations are allowed as well as the regular operations. There is even a provision for contravariant columns. One of the problems with matrices is that they lack context. How was the original matrix defined? Are you dealing with it, or the transpose, or the inverse, or the inverse transpose? Here the rows and columns are always labeled to give context. So here is a variant of your example:

<< Presentations`
amat = {{1, t}, {-1, 0}};

First we set up the matrix form. The LEWhiteboard is a palette that displays the current structure and allows positions to be pasted into commands.

seExample = LECreate[2, 4];
LEColumnDividers[seExample, {2}]

enter image description here

Next we fill in the matrix also giving new row and column names.

LEInsertRowNames[seExample, 1, {y1, y2}]
LEInsertColumnNames[seExample, 1, {x1, x2, y1, y2}]
LEInsertMatrix[seExample, {1, 1}, amat]
LEInsertMatrix[seExample, {1, 3}, IdentityMatrix[2]]

enter image description here

The following extracts the equations from the matrix structure.

LERowExpression[seExample, #, 3 ;; 4] == 
    LERowExpression[seExample, #, 1 ;; 2] & /@ {1, 2} // Column

enter image description here

The following does a pivot on the first row and column to give upper echelon row form. One can do full pivots or just pivot on select rows.

LEPivot[seExample, {1, 1}, 2 ;; 2]

enter image description here

Next we set t to zero and also draw an extra row divider.

seExample = seExample /. t -> 0;
LERowDividers[seExample, {1}]

enter image description here

Finally, we display the new row equations. The last equation gives the restraint that must hold among the y's when t = 0.

LERowExpression[seExample, #, 3 ;; 4] == 
    LERowExpression[seExample, #, 1 ;; 2] & /@ {1, 2} // Column

enter image description here

This is useful for learning basic matrix operations and working small problems within a context.

share|improve this answer
The OP actually said "I don't know much about the matrices" - I think they were implying that there is a lack of a priori information about the specific matrices to be processed. – Simon Woods Jul 29 '13 at 20:12
@SimonWoods is right, I'm sorry for the misleading formulation. – user8774 Jul 30 '13 at 14:35

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.