Re: check if a square matrix is diagonal

*To*: mathgroup at smc.vnet.net*Subject*: [mg115366] Re: check if a square matrix is diagonal*From*: Bill Rowe <readnews at sbcglobal.net>*Date*: Sun, 9 Jan 2011 02:17:54 -0500 (EST)

On 1/8/11 at 3:39 AM, akoz at mimuw.edu.pl (Andrzej Kozlowski) wrote: >An simpler approach is: >diagonalQ[m_] := UpperTriangularize[m] = LowerTriangularize[m] >This is slower for diagonal matrices but very much faster for >non-diagonal ones. Even simpler is the suggestion Dr Bob made: m==DiagonalMatrix[Diagonal@m] And after I had made my post I thought of something else that seems fast which is Total[Unitize@m,2]==Total[Unitize@Diagonal[m]] It terms of speed for non-diagonal matrices, the simple method suggested by Dr Bob is the fastest In[1]:= m = RandomReal[1, {10000, 10000}]; In[2]:= Timing[UpperTriangularize[m] == LowerTriangularize[m]] Out[2]= {2.51418,False} In[3]:= Timing[Total[Unitize@m, 2] == Total[Unitize@Diagonal[m]]] Out[3]= {1.09644,False} In[4]:= Timing[m == DiagonalMatrix[Diagonal@m]] Out[4]= {0.770909,False} But for a diagonal matrix In[5]:= m = SparseArray[Band[{1, 1}] -> RandomReal[1, {10000}]]; In[6]:= Timing[UpperTriangularize[m] == LowerTriangularize[m]] Out[6]= {0.099239,True} In[7]:= Timing[Total[Unitize@m, 2] == Total[Unitize@Diagonal[m]]] Out[7]= {0.049362,True} In[9]:= Timing[m == DiagonalMatrix[Diagonal@m]] Out[9]= {0.067637,True} It appears using Total and Unitize to count the non-zero entries of m is faster. it would seem