MathGroup Archive 1996

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

Search the Archive

Re: Please Help

  • To: mathgroup at smc.vnet.net
  • Subject: [mg4143] Re: Please Help
  • From: gaylord at ux1.cso.uiuc.edu (richard j. gaylord)
  • Date: Fri, 7 Jun 1996 02:08:01 -0400
  • Organization: university of illinois
  • Sender: owner-wri-mathgroup at wolfram.com

In article <4ou1ql$7tp at dragonfly.wolfram.com>, lou at wolfram.com (Lou
D'Andria) wrote:

In[3]:=
NeighborhoodMaxes[ mat_?(MatrixQ[#,Positive]&) ] := 
        Apply[Max, Partition[#,{3,3},{1,1}], {2}]& @
        Join[{#},Join[{0},#,{0}]& /@ mat,{#}]& @
        Table[{0},{2 + Length[First[mat]]}]

>you can
> use Partition to get the neighborhoods, and Max to find the maximum in
> each neighborhood.

> I can't take credit for discovering this Partition method of extracting
> neighborhoods, but I no longer remember who first showed it to me.

this method is used in the Life.m notebook that came with with mathematica
1.0 (and each newer version as well, though i don't know why since it is
not a very good mathematica program).

unfortunately it is a SLOOOW way to work with neighborhoods.

here is a way which is faster [and the  speed difference increases with
the lattice size].

note: the following is taken from the book "Modleing Nature: Cellular
Automata Simulationsd with Mathematica" coming out in about six weeks.

In[1]:=
Moore[func__, lat_] :=   
  MapThread[func, 
              Map[RotateRight[lat, #]&, 
          {{0, 0}, {1, 0}, {0, -1}, {-1, 0}, {0, 1}, 
           {1,  -1}, {-1, -1}, {-1, 1}, {1, 1}}], 2]

In[2]:=
 absorbBC = (Prepend[Append[Map[Prepend[Append[#, 0], 0]&, #],
                   Table[0, {Dimensions[#][[2]] + 2}]], 
                   Table[0, {Dimensions[#][[2]]+ 2}]])&;

In[24]:=
Map[Take[#, {2, -2}]&, Take[Moore[Max, absorbBC[lat]], {2, -2}]]

timing comaprision [on a powermac 8500/120]

In[4]:=
lat = Table[ Random[Integer,{1,9}], {100},{150}];

In[7]:=
Timing[dog = Map[Take[#, {2, -2}]&, Take[Moore[Max, absorbBC[lat]], {2, -2}]];]
Out[7]=
{1.68333 Second, Null}

In[8]:=
Timing[cat = NeighborhoodMaxes[lat];]
Out[8]=
{2.65 Second, Null}

In[9]:=
dog == cat
Out[9]=
True


In[11]:=
Timing[dog = Map[Take[#, {2, -2}]&, Take[Moore[Max, absorbBC[lat]], {2, -2}]];]
Out[11]=
{3.03333 Second, Null}

In[12]:=
Timing[cat = NeighborhoodMaxes[lat];]
Out[12]=
{4.18333 Second, Null}

In[13]:=
dog == cat
Out[13]=
True

moral of the story: never dissasemble a matrix and the reassemble it
later. use mathematica's apl-like ability to manipulate entire matrices in
order to feed neighborhood values into whatever function you want to apply
to the neighborhoods.

-- 
"if you're not programming functionally, then you're programming dysfunctionally"

==== [MESSAGE SEPARATOR] ====


  • Prev by Date: MathLink questions
  • Next by Date: Kei Ker from Bessel functions
  • Previous by thread: Re: Please Help
  • Next by thread: Re: Please Help