Mathematica 9 is now available
Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
2002
*January
*February
*March
*April
*May
*June
*July
*August
*September
*October
*November
*December
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 2002

[Date Index] [Thread Index] [Author Index]

Search the Archive

RE: friendly challenge 3

  • To: mathgroup at smc.vnet.net
  • Subject: [mg35112] RE: [mg35076] friendly challenge 3
  • From: "DrBob" <majort at cox-internet.com>
  • Date: Tue, 25 Jun 2002 03:41:05 -0400 (EDT)
  • Reply-to: <drbob at bigfoot.com>
  • Sender: owner-wri-mathgroup at wolfram.com

How's this?

Needs["Statistics`DescriptiveStatistics`"]
ClearAll[sign2, bt, tst]
sign2[M_?MatrixQ] := 
  Count[Eigenvalues[M], _?(# > 0 &)] - Count[Eigenvalues[M], _?(# < 0
&)]
bt[M_?MatrixQ] := Plus @@ (Sign /@ Eigenvalues[M])
tst[k_Integer] := (m = Table[Random[Integer, {1, 9}], {k}, {k}]; 
    n = m + Transpose[m];
    First[Timing[#[n]]] & /@ {sign2, bt}
    )
tst[k_Integer, i_Integer] := Module[{t},
    t = Mean /@ Transpose[tst[k] & /@ Range[i]];
    {t, t[[1]]/t[[2]]}
    ]

tst[30, 10]
{{0.808 Second, 0.3344 Second}, 2.41627}

tst[40, 20]
{{2.5693 Second, 1.15175 Second}, 2.23078}

tst[50, 10]
{{7.1828 Second, 3.1859 Second}, 2.25456}

Bobby Treat

-----Original Message-----
From: Andrzej Kozlowski [mailto:andrzej at platon.c.u-tokyo.ac.jp] 
To: mathgroup at smc.vnet.net
Subject: [mg35112] [mg35076] friendly challenge 3

While the season for "friendly challenges" lasts, here is something that

has just come up in my own work. Let's define the signature of a 
symmetric matrix as the number of positive eigenvalues - the number of 
negative ones. I need an efficient function to compute this.
There is the obvious and rather pedestrian one:

sign2[M_?MatrixQ] :=
   Count[Eigenvalues[M], _?(# > 0 &)] - Count[Eigenvalues[M], _?(# < 0
&)]

For example, let's construct a symmetric matrix of random integers (all 
matrices I am considering have integer entries):

m = Table[Random[Integer, {1, 9}], {30}, {30}]; n = m + Transpose[m];

the above sign2 gives:

In[4]:=
sign2[n]//Timing

Out[4]=
{3.5 Second,0}



My best function, sign1 gives (on 400 mghz PowerBOok G4)

In[5]:=
sign1[n]//Timing

Out[5]=
{1.44 Second,0}

Nearly two and a half times as fast. Can anyone do better?

Andrzej






  • Prev by Date: Re; FourierTransform problem
  • Next by Date: Re: friendly challenge 3
  • Previous by thread: Re: friendly challenge 3
  • Next by thread: Re: friendly challenge 3