I want to create in an automatic way some matrices to do symbolic calculations with them. They look like these:

(a0b00100b0a00001)

\left(

\begin{array}{cccc}

a & 0 & b & 0 \\

0 & 1 & 0 & 0 \\

b & 0 & a & 0 \\

0 & 0 & 0 & 1

\end{array}

\right)

So they have entry aa in at position (1,1)(1,1) and (3,3)(3,3) and entry bb at position (1,3)(1,3) and (3,1)(3,1) and the rest of the entries are 1 on the diagonal and zero elsewhere. So in general i want a symmetric n×nn\times n matrix with bb at position (i,j)(i,j) and (j,i)(j,i) and aa at position (i,i)(i,i) and (j,j)(j,j) How can i create these kind of matrices automatically?

Probably it is possible to write some function T[n,i,j] that gives as value the corresponding matrix.

(I have no insight into possible implementations of the solution, so additional Tags are welcome!)

=================

=================

2 Answers

2

=================

This makes a matrix of arbitrary size n :

f[n_, i_, j_] :=

ReplacePart[

Array[0 &, {n, n}],

{{i, i} -> a, {j, j} -> a, {i, j} -> b, {j, i} -> b, {k_, k_} -> 1 }]

f[4, 1, 3] //Grid

1

+1 for understanding what the OP wanted. However, I still recommend a SparseArray approach. See my updated answer for examples.

– Mr.Wizard♦

Jan 13 ’14 at 15:34

I have replaced T[…] by f[…] because symbols that begin with a uppercase are normally Mathematica built-in symbols

– andre

Jan 13 ’14 at 17:41

You should take a look at SparseArray and Band:

SparseArray[{

Band[{1, 1}, {4, 4}] -> {a, 1},

{1, 3} -> b, {3, 1} -> b

}] // MatrixForm

(a0b00100b0a00001)\left(

\begin{array}{cccc}

a & 0 & b & 0 \\

0 & 1 & 0 & 0 \\

b & 0 & a & 0 \\

0 & 0 & 0 & 1

\end{array}

\right)

It seems I misunderstood the output you wanted. Here is a function that mimics andre’s output, but uses the more efficient SparseArray format:

f1[n_, i_, j_] :=

SparseArray[

{{i, i} -> a, {j, j} -> a, {i, j} -> b, {j, i} -> b, {k_, k_} -> 1},

{n, n}

]

For greater efficiency we can build a sparse IdentityMatrix and make replacements as andre did:

f2[n_, i_, j_] :=

ReplacePart[

IdentityMatrix[n, SparseArray],

{{i, i} -> a, {j, j} -> a, {i, j} -> b, {j, i} -> b}

]

Syntax is the same:

f2[7, 5, 2] // MatrixForm

(10000000a00b00001000000010000b00a0000000100000001)\left(

\begin{array}{ccccccc}

1 & 0 & 0 & 0 & 0 & 0 & 0 \\

0 & a & 0 & 0 & b & 0 & 0 \\

0 & 0 & 1 & 0 & 0 & 0 & 0 \\

0 & 0 & 0 & 1 & 0 & 0 & 0 \\

0 & b & 0 & 0 & a & 0 & 0 \\

0 & 0 & 0 & 0 & 0 & 1 & 0 \\

0 & 0 & 0 & 0 & 0 & 0 & 1

\end{array}

\right)

To make this general for arbitrary size and position i tried T[n_, i_, j_] := SparseArray[{Band[{1, 1}, {n, n}] -> 1, {i, i} | {j, j} -> a, {i, j} | {j, i} -> b}]which does not seem to work. I think this is now a question on properly defining a function.

– user11712

Jan 13 ’14 at 14:18

@user11712 Okay, give me a minute to update my answer.

– Mr.Wizard♦

Jan 13 ’14 at 14:19

@user11712 I see for your Acceptance of andre’s answer that I apparently misunderstood what you wanted. Nevertheless I encourage you to use the SparseArray format instead for a matrix with a background value (default zero) as it is more efficient. I shall add a function to my answer that mimics andre’s output.

– Mr.Wizard♦

Jan 13 ’14 at 15:21