Re: Simply but handy question
- To: mathgroup at smc.vnet.net
- Subject: [mg124852] Re: Simply but handy question
- From: Bill Rowe <readnews at sbcglobal.net>
- Date: Thu, 9 Feb 2012 05:41:09 -0500 (EST)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
On 2/8/12 at 5:29 AM, jediwhelan at googlemail.com (jediwhelan) wrote: >I am new to mathematica (well, I'm not actually but I haven't used >it in 5 years +). >Is there an easy way to return a matrix X of 1's and 0's to test >whether the entries in Y are different from zero. >i.e., >if Y = {{a,b},{0,c}} >Then X would return >X = {{1,1},{0,1}} If the non-zero entries have numeric values, Unitize will do what you want. For example: In[1]:= {a, b, c} = RandomReal[1, {3}]; y = {{a, b}, {0, c}}; Unitize[y] Out[3]= {{1, 1}, {0, 1}} If there are symbols that do not have numeric values assigned, then Unitize won't do. You would need to use pattern matching to replace these symbols. Something like: In[4]:= Clear[a, b, c, y]; y = {{a, b}, {0, c}}; Map[# /. a_Symbol -> 1 &, y, {2}] Out[6]= {{1, 1}, {0, 1}} Note, while this will work for symbolic arrays it will be considerably slower than using Unitize with large numeric arrays. >This would be handy for very large or complicated matrices where one >would like to know if specific entries are zero? For very large arrays with few zeros and numeric entries, I would locate the zeros by ArrayRules@SparseArray[Unitize[matrix]-1] Also, you might consider ArrayPlot[Unitize[matrix]] For very large arrays, with quite a few zeros this will probably be the best way to visualize where the zeros are.