Re: Re: ListCorrelate[] ??
- To: mathgroup at smc.vnet.net
- Subject: [mg30215] Re: [mg30182] Re: ListCorrelate[] ??
- From: "Mariusz Jankowski" <mjkcc at usm.maine.edu>
- Date: Thu, 2 Aug 2001 03:16:08 -0400 (EDT)
- References: <9jtkeq$894$1@smc.vnet.net> <200108010619.CAA03979@smc.vnet.net> <3B68324F.B2189A94@nature.berkeley.edu>
- Sender: owner-wri-mathgroup at wolfram.com
Brent, forget my comment about the ListCorrelate parameter. The two forms
{n,-n} and {n,n} are equivalent whenever n=(Length[ker]+1)/2, so my earlier
statement was inaccurate. The two forms both refer to the same element in
list ker, namely the middle one for odd length lists ker.
----- Original Message -----
From: "Brent Pedersen" <bpederse at nature.berkeley.edu>
To: mathgroup at smc.vnet.net
Subject: [mg30215] Re: [mg30182] Re: ListCorrelate[] ??
>
> thanks,
> i had not tried Tr[Flatten[...]] for quick summation.
> but, now i am confused about the 3rd argument in ListCorrelate[]...
> first to answer your question. yes, this is similar to edge enhancement
> for DIP but, i am using it to simulate dispersal of populations where
> each entry of the matrix is a population density and ListCorrelate[]
simulates
> dispersal.
> i assume (to avoid a loss of individuals at the edge of the lattice)
> periodic boundaries such that the surface essentially becomes a torus
> (or a donut as noted by Daniel Licthblau).
> so, i have been using ListCorrelate[kern,matrix, {n,-n}]
> where n is the maximum dispersal radius +1
> because this allows the kernel to "hang" over the edge of the population
> lattice by n on all sides. then, for the case where i wish
> to have "absorbing boundaries" where individuals can move off
> the matrix i use:
> ListCorrelate[kern,matrix, {n,-n},0]
> assuming that the automatic padding is at least n zeros on all sides.
> is this correct for my purposes?
Yes, the constant parameter 0 will cause padding of data with zeros to the
extent defined by value n.
> and another question, how would one create "reflecting boundaries" where
> individuals that would normally leave the edge of the matrix, instead
> remain on the edge?
>
If you mean a boundary extension that replicates the first/last element (or
n elements) of each row or column, the solution is not so simple, meaning it
cannot be accomplished inside of ListCorrelate. For the simplest case of
padding a 1-D list with one element on both ends the solution is:
In[68]:=
data = Range[5]
Out[68]=
{1, 2, 3, 4, 5}
In[69]:=
PadLeft[PadRight[data, Length[data] + 1, data[[-1]]],
Length[data] + 2, data[[1]]]
Out[69]=
{1, 1, 2, 3, 4, 5, 5}
For matrices, a simple minded but effective approach is to repeat the above
for all rows and columns. So define
fixedPad[data_List] := PadLeft[PadRight[data, Length[data] + 1,
data[[-1]]],
Length[data] + 2, data[[1]]];
and
Transpose[fixedPad /@ Transpose[fixedPad/@data]],
finally, since you padded the data use the following form of ListCorrelate
(of course, will only work correctly for 3x3 kernel):
ListCorrelate[ker, paddeddata]
A multidimensional FixedPad function is in my Digital Image Processing
package :).
Hope this helps,
Mariusz
======================================================
Mariusz Jankowski
University of Southern Maine
mjkcc at usm.maine.edu
- References:
- Re: ListCorrelate[] ??
- From: "Mariusz Jankowski" <mjkcc@usm.maine.edu>
- Re: ListCorrelate[] ??