MathGroup Archive 2001

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

Search the Archive

Re: ListCorrelate[] ??

  • To: mathgroup at smc.vnet.net
  • Subject: [mg30128] Re: [mg30104] ListCorrelate[] ??
  • From: Daniel Lichtblau <danl at wolfram.com>
  • Date: Sun, 29 Jul 2001 21:26:19 -0400 (EDT)
  • References: <200107280551.BAA08392@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

Brent Pedersen wrote:
> 
> with a real square matrix H, I calculate the sum of each cell and its 8
> neighbors as:
> Htot=ListCorrelate[kern, H ,{2,-2}];     (thanks to the help of some of
> you)
> where:
> kern = Table[1, {3}, {3}];
> 
> now, for each 9 cell neighborhood around (and including cell H[[i,j]], I
> wish to calculate:
> Sum[(H[[m,n]]/Htot[[i,j]])^c,{m,i-1,i+1},{n,j-1,j+1}];
> (when c=1, this will be 1.)
> of course, this code won't work as is but the idea is there.I can write
> loops containing a Sum[] similar to that above,but i am sure that
> ListCorrelate[] operates much faster (which is important since H is
> 256*256).in short, i need to output a 256*256 matrix where each cell
> contains the result of the Sum[] function above.
> 
> ListCorrelate[kern, H/Htot,{2,-2}]; does not work because it contains
> H[[i,j]]/Htot[[i,j]]  not H[[i,j]]/Htot[[m,n]];
> 
> will some variation of
> ListCorrelate[H, 1/Htot, {n,-n}]; work?
> as yet, no luck with that.
> any ideas will be greatly appreciated.
> thanks,
> -brent

It appears you want to take the correlated cth power of your matrix
divided by the cth power of the correlated matrix. This may be done as
below.

size = 256;
c = 2;
hmat = Table[Random[], {size}, {size}];
kernel = Table[1, {3}, {3}];

In[35]:= Timing[
  hcorr = ListCorrelate[kernel, hmat, {2,-2}];
  hpowercorr = ListCorrelate[kernel, hmat^c, {2,-2}];
  result = hpowercorr / hcorr^c;
  ]                           
Out[35]= {1.22 Second, Null}

The above uses cyclic repition of the second argument at the boundaries.
If you are doing image processing then this would not be desirable
(unless your picture came off a bagel). In that case a reasonable thing
might be to border your array with copies of the first and last rows and
columns. This could be accomplished as below.

 <<LinearAlgebra`MatrixManipulation`

borderMatrix[mat_?MatrixQ] := With[
	{newmat=AppendColumns[{First[mat]},mat,{Last[mat]}]},
	AppendRows[Transpose[{newmat[[All,1]]}],newmat,
	  Transpose[{newmat[[All,Length[newmat[[1]]]]]}]]
	]

In[36]:= borderMatrix[Array[a, {3,3}]] // MatrixForm

Out[36]//MatrixForm= a[1, 1]   a[1, 1]   a[1, 2]   a[1, 3]   a[1, 3]

                     a[1, 1]   a[1, 1]   a[1, 2]   a[1, 3]   a[1, 3]

                     a[2, 1]   a[2, 1]   a[2, 2]   a[2, 3]   a[2, 3]

                     a[3, 1]   a[3, 1]   a[3, 2]   a[3, 3]   a[3, 3]

                     a[3, 1]   a[3, 1]   a[3, 2]   a[3, 3]   a[3, 3]


Daniel Lichtblau
WOlfram Research


  • Prev by Date: Two factors of (10^71-1)/9 = R71
  • Next by Date: Re: Transferring graphics from Mathematica to MS Word
  • Previous by thread: ListCorrelate[] ??
  • Next by thread: subscripted variables in Modules