Re: Please Help
- To: mathgroup at smc.vnet.net
- Subject: [mg4159] Re: [mg4093] Please Help
- From: Allan Hayes <hay at haystack.demon.co.uk>
- Date: Sat, 8 Jun 1996 13:24:24 -0400
- Sender: owner-wri-mathgroup at wolfram.com
Takuo Henmi <takuo at psy.uwa.edu.au>
in [mg4093] Please Help
asks how to replace each entry in a non-negative entry matrix with
the maximum of itself and its neighbors (diagonal neighbors
included).Original query attached
Takuo: here is one way
br[m_] := Join[{#},m,{#}]&[0&/@m[[1]]];(*zero rows top and bottom*)
bm[m_] := Thread[br[Thread[br[m]]]]; (*border with zeros*)
km[m_] := Thread[Take[Thread[Take[m,{2,-2}]],{2,-2}]](*drop border *)
mm[m_] := (*give result required*)
km[
MapThread[
Max,
{ RotateRight[#,{0,0}],
RotateRight[#,{1,0}],
RotateRight[#,{-1,0}],
RotateRight[#,{0,1}],
RotateRight[#,{0,-1}],
RotateRight[#,{1,1}],
RotateRight[#,{1,-1}],
RotateRight[#,{-1,1}],
RotateRight[#,{-1,-1}]
},
2
]&[bm[m]]
];
Check:
(mat = {{ 1, 2, 3},{2, 3, 4},{2,1,1}})//MatrixForm
1 2 3
2 3 4
2 1 1
mm[mat]//MatrixForm
3 4 4
3 4 4
3 4 4
The following version of mm is more compact:
temp = {{0,0},{1,0},{-1,0},{0,1},{0,-1},{1,1},{-1,1},{-1,1},{-1,-1}};
mm2[m_] :=
km[MapThread[
Max,
Apply[RotateRight, Thread[{bm[m],temp}, List, {-1}],{1}],
2
]];
****************
Original query
>From: Takuo Henmi <takuo at psy.uwa.edu.au>
>To: mathgroup at smc.vnet.net
>Subject: [mg4093] Please Help
>Organization: The University of Western Australia
For those mathematica wizs, please help me.
My question is how to find the max. value of its neighbors in a
matrix, i.e.
if you have a matrix
1 2 3
2 3 4
2 1 1
(it'll always be a square matrix)
the max of the neighbors of cell [1,1] would be 3 (cell [2,2]), right?
so new cell [1,1] will be 3. Like that, you'll have a new matrix,
in this case,
3 4 4
3 4 4
3 4 4
(including the cell itself, e.g. cell [2,3]) and the boundaries are
all 0s.
Now I don't want to use like variable a[i,j], instead I wanna use
a={{...},...,{...}}
PLease help me if you would.
Thanks in advance.
Takuo Henmi
==== [MESSAGE SEPARATOR] ====