# Matrix conditional operation

Say I have a matrix of:

tmp1 = 5;
tmp2 = 5;
tmp3 = RandomChoice[{0, 1, 2, 3, 4, 5}, {tmp1, tmp2}];
MatrixForm[tmp3]


How to do a conditional operation of elements - 1 if non-zero, else do nothing, as in the attached:. Maybe using Positive?

-
tmp3 /. (x_ ?Positive -> x - 1)? – b.gatessucks Nov 13 '12 at 15:14
tmp3 /. x_?Positive :> x - 1 or tmp3 - Boole[Positive[tmp3]] then? – J. M. Nov 13 '12 at 15:17
Hi @b.gatessucks and J.M thanks you are very helpful. – sebastian c. Nov 13 '12 at 15:20
Hi @whuber Thanks. – sebastian c. Nov 15 '12 at 0:12

Another possibility is to use Sign[]. To make each positive element of the matrix decrease by one:

tmp3-Sign[tmp3]

-
You probably want Abs@Sign@tmp3, which is the same as Unitize. – R. M. Nov 13 '12 at 16:12
OPs matrix is all positive integers, so it's the same. But it is not clear what the desired behavior would be if you had negative integers: using Sign[ ] they would all head towards zero; using Unitize the negatives would keep decreasing. – bill s Nov 13 '12 at 16:24

You have lots of options. Among them Replace:

Replace[tmp3, x : Except[0] :> x - 1, {2}]


And numerically for the entire matrix:

tmp3 - Unitize[tmp3]

-