2

This may be a trivial question, but I have been at it for a couple of hours and I have not made much progress. I have a 10 x 10 array (T) that I have used to generate an 8 x 8 array (Q). I want to replace the interior of array T with array Q. I can think of lots of really cumbersome ways to do this, but I assume that there is a "good" way to do this...

I suspect that this can be done using ReplaceAll but I cannot get the form correct.

Any pointers would be greatly appreciated.

The code and arrays are:

Nx = 10;
Ny = 10;
(* Initial Temperature Array *)
T = Table[0, {i, Nx}, {j, Ny}];
T[[1]] = Table[Tbottom, {i, Nx}];
T[[Ny]] = Table[Ttop, {i, Nx}];
T[[All, 1]] = Tleft;
T[[All, Nx]] = Tright;
(* Finite Difference of Array *)
Q = Table[
   0.25*(T[[i - 1, j]] + T[[i, j + 1]] + T[[i + 1, j]] + 
      T[[i, j - 1]]), {i, 2, Nx - 1}, {j, 2, Ny - 1}];
(* Output in Matrix Form *)
T // MatrixForm
Q // MatrixForm

Array T $$ \left( \begin{array}{cccccccccc} 50 & 50 & 50 & 50 & 50 & 50 & 50 & 50 & 50 & 50 \\ 50 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 50 \\ 50 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 50 \\ 50 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 50 \\ 50 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 50 \\ 50 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 50 \\ 50 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 50 \\ 50 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 50 \\ 50 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 50 \\ 50 & 100 & 100 & 100 & 100 & 100 & 100 & 100 & 100 & 50 \\ \end{array} \right) $$

Array Q $$ \left( \begin{array}{cccccccc} 25. & 12.5 & 12.5 & 12.5 & 12.5 & 12.5 & 12.5 & 25. \\ 12.5 & 0. & 0. & 0. & 0. & 0. & 0. & 12.5 \\ 12.5 & 0. & 0. & 0. & 0. & 0. & 0. & 12.5 \\ 12.5 & 0. & 0. & 0. & 0. & 0. & 0. & 12.5 \\ 12.5 & 0. & 0. & 0. & 0. & 0. & 0. & 12.5 \\ 12.5 & 0. & 0. & 0. & 0. & 0. & 0. & 12.5 \\ 12.5 & 0. & 0. & 0. & 0. & 0. & 0. & 12.5 \\ 37.5 & 25. & 25. & 25. & 25. & 25. & 25. & 37.5 \\ \end{array} \right) $$

navillus5
  • 155
  • 6

1 Answers1

4

The easiest and most general way is to use a direct assignment on Part, using Span.
First some simpler sample data:

T = ArrayPad[ConstantArray[0, {5, 5}], 1, 1];
Q = Array[Multinomial, {5, 5}];

T // MatrixForm
Q // MatrixForm

Mathematica graphics

Mathematica graphics

Either copy the data to a new symbol as below, or use T directly for in-place modification:

newT = T;

newT[[2 ;; -2, 2 ;; -2]] = Q;

newT

Mathematica graphics

For more examples of the power of this method see:
Elegant operations on matrix rows and columns

Mr.Wizard
  • 271,378
  • 34
  • 587
  • 1,371
  • Thanks so much for the quick reply. This is exactly what I was looking for. Turns out I was sort of close (at one point...) when I tried something like {{2;;10},{2;;10}}. – navillus5 Mar 14 '13 at 21:10