DiadonalQ
- To: mathgroup at christensen.cybernetics.net
- Subject: [mg1876] DiadonalQ
- From: Allan Hayes <hay at haystack.demon.co.uk>
- Date: Sat, 12 Aug 1995 22:49:14 -0400
Dave Wagner <wagner at bullwinkle.cs.Colorado.EDU> in [mg1741] Count Dracula <lk3a at kelvin.seas.virginia.edu> in [mg1840] Posted testsfor a matrix being diagonal. The following, though not part of a wider testing style, is simpler and quicker for this purpose. diagonalQ2[m_] := DiagonalMatrix[Transpose[m,{1,1}]] == m It depends on Transpose[m,{1,1}] giving the diagonal of m. Allan Hayes De Montfort University Leicester hay at haystack.demon.co.uk ********* COMPARISONS: on a NeXT Color Turbo (*Wagner*) DiagonalQ[m_] := And @@ Flatten[ MapIndexed[ #1==0 || Equal @@ #2 &, m, {2} ]] (*Dracula*) diagonalQ[m_?MatrixQ] := Block[{n, row}, n = Length[m]; row = Table[0, {n - 1}]; And @@ Map[Equal[#1, row]&, MapThread[Drop, {m, Partition[Range[n], 1]}]] ] /; SameQ @@ Dimensions[m] (1) mat = DiagonalMatrix[Range[100]] DiagonalQ[mat]//Timing diagonalQ[mat]//Timing diagonalQ2[mat]//Timing {3.56667 Second, True} {0.133333 Second, True} {0.0666667 Second, True} (2) nd = Table[Random[Integer],{100},{100}]; DiagonalQ[nd]//Timing diagonalQ[nd]//Timing diagonalQ2[nd]//Timing {5.51667 Second, False} {0.1 Second, False} {0.0666667 Second, False} (3) nz1 = Table[0,{100},{100}]; nz1[[100,99]] = 1; DiagonalQ[nz1]//Timing diagonalQ[nz1]//Timing diagonalQ2[nz1]//Timing {3.63333 Second, False} {0.116667 Second, False} {0.0666667 Second, False} (4) nz2 = Table[0,{100},{100}]; nz2[[1,2]] = 1; DiagonalQ[nz2]//Timing diagonalQ[nz2]//Timing diagonalQ2[nz2]//Timing {3.43333 Second, False} {0.116667 Second, False} {0.0666667 Second, False}