2
$\begingroup$

I want to write a function that can automatically analyze any square matrices with periodic band diagonals and give continuations of them. But I can't figure out an elegant way to do this.

Suppose we have written such a function called continuation, and suppose we have an example square matrix mat of order 8 as

$\small \mathtt{mat}=\begin{pmatrix} y+0.2 & 2 \text{t1} & 0.2 & \text{t1} & 0 & 0 & 0 & 0 \\ 2 \text{t1} & 0.2\, -y & 0 & 0.2 & 0 & 0 & 0 & 0 \\ 0.2 & 0 & y+0.2 & 2 \text{t1} & 0.2 & \text{t1} & 0 & 0 \\ \text{t1} & 0.2 & 2 \text{t1} & 0.2\, -y & 0 & 0.2 & 0 & 0 \\ 0 & 0 & 0.2 & 0 & y+0.2 & 2 \text{t1} & 0.2 & \text{t1} \\ 0 & 0 & \text{t1} & 0.2 & 2 \text{t1} & 0.2\, -y & 0 & 0.2 \\ 0 & 0 & 0 & 0 & 0.2 & 0 & y+0.2 & 2 \text{t1} \\ 0 & 0 & 0 & 0 & \text{t1} & 0.2 & 2 \text{t1} & 0.2\, -y \\ \end{pmatrix}$

then continuation[mat][n] can give a square matrix that is a continuation of original mat with order n. For example:

continuation[mat][9]

should give a continuation of mat of order 9 as following

$\small \begin{pmatrix} y+0.2 & 2 \text{t1} & 0.2 & \text{t1} & 0 & 0 & 0 & 0 & 0 \\ 2 \text{t1} & 0.2\, -y & 0 & 0.2 & 0 & 0 & 0 & 0 & 0 \\ 0.2 & 0 & y+0.2 & 2 \text{t1} & 0.2 & \text{t1} & 0 & 0 & 0 \\ \text{t1} & 0.2 & 2 \text{t1} & 0.2\, -y & 0 & 0.2 & 0 & 0 & 0 \\ 0 & 0 & 0.2 & 0 & y+0.2 & 2 \text{t1} & 0.2 & \text{t1} & 0 \\ 0 & 0 & \text{t1} & 0.2 & 2 \text{t1} & 0.2\, -y & 0 & 0.2 & 0 \\ 0 & 0 & 0 & 0 & 0.2 & 0 & y+0.2 & 2 \text{t1} & 0.2 \\ 0 & 0 & 0 & 0 & \text{t1} & 0.2 & 2 \text{t1} & 0.2\, -y & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0.2 & 0 & y+0.2 \\ \end{pmatrix}$

How to write such a continuation function which can automatically analyze square matrices with periodic diagonal band and give general continuation version?

The list representation of mat is here:

mat = {{0.2 + y, 2 t1, 0.2, t1, 0, 0, 0, 0},
       {2 t1, 0.2 - y, 0, 0.2, 0, 0, 0, 0},
       {0.2, 0, 0.2 + y, 2 t1, 0.2, t1, 0, 0},
       {t1, 0.2, 2 t1, 0.2 - y, 0, 0.2, 0, 0},
       {0, 0, 0.2, 0, 0.2 + y, 2 t1, 0.2, t1},
       {0, 0, t1, 0.2, 2 t1, 0.2 - y, 0, 0.2},
       {0, 0, 0, 0, 0.2, 0, 0.2 + y, 2 t1},
       {0, 0, 0, 0, t1, 0.2, 2 t1, 0.2 - y}}
$\endgroup$
  • $\begingroup$ This is quite a complex task, unless you specify what exact type of continuations you mean... You say periodic, so I would guess start by writing a peroid-finding function for lists... $\endgroup$ – Per Alexandersson Dec 15 '14 at 11:47
3
$\begingroup$

Using the function FindTransientRepeat[], we can do the following:

mat = SparseArray[mat];
m = 10; {lo, up} = MinMax[mat["NonzeroPositions"].{-1, 1}];
sp = SparseArray[Table[With[{d = Diagonal[mat, k], p = Abs[k]}, 
                            Band[If[k >= 0, Identity, Reverse][{1, p + 1}]] ->
                            (PadRight[#1, m - p, #2] & @@ FindTransientRepeat[d, 2])],
                       {k, lo, up}]];

MatrixForm[sp]

$$\tiny\begin{pmatrix} y+0.2 & 2 \text{t1} & 0.2 & \text{t1} & 0 & 0 & 0 & 0 & 0 & 0 \\ 2 \text{t1} & 0.2\, -y & 0 & 0.2 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0.2 & 0 & y+0.2 & 2 \text{t1} & 0.2 & \text{t1} & 0 & 0 & 0 & 0 \\ \text{t1} & 0.2 & 2 \text{t1} & 0.2\, -y & 0 & 0.2 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0.2 & 0 & y+0.2 & 2 \text{t1} & 0.2 & \text{t1} & 0 & 0 \\ 0 & 0 & \text{t1} & 0.2 & 2 \text{t1} & 0.2\, -y & 0 & 0.2 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0.2 & 0 & y+0.2 & 2 \text{t1} & 0.2 & \text{t1} \\ 0 & 0 & 0 & 0 & \text{t1} & 0.2 & 2 \text{t1} & 0.2\, -y & 0 & 0.2 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0.2 & 0 & y+0.2 & 2 \text{t1} \\ 0 & 0 & 0 & 0 & 0 & 0 & \text{t1} & 0.2 & 2 \text{t1} & 0.2\, -y \end{pmatrix}$$

$\endgroup$
  • $\begingroup$ Thank you so much for this new FindTransientRepeat[] function +1 $\endgroup$ – matheorem Aug 15 '17 at 7:59
2
$\begingroup$

Since no one gave a satisfactory answer, I figured out a way myself which combines Band, Diagonal and SparseArray.

  1. The Diagonal[m,k]gives the elements on the $k^{th}$ diagonal of m, illustrated as below:

    enter image description here

  2. Band in SparseArray can repeat the values cyclically, for example:

    SparseArray[Band[{1, 1}, {5, 5}] -> {x, y, z}, {5, 5}] // MatrixForm
    

    gives

    $\begin{pmatrix} x & 0 & 0 & 0 & 0 \\ 0 & y & 0 & 0 & 0 \\ 0 & 0 & z & 0 & 0 \\ 0 & 0 & 0 & x & 0 \\ 0 & 0 & 0 & 0 & y \\ \end{pmatrix}$

  3. Tally can find the cyclic sequence, since Tally tallies the elements in list, listing all distinct elements together with their multiplicities. for example:

    Tally[Diagonal[mat]]
    

    gives

    {{0.2 + y, 4}, {0.2 - y, 4}}
    

    so

    Tally[Diagonal[mat]][[;;,1]] 
    

    give the cyclic sequence {0.2 + y, 0.2 - y}

So combine these 3 features we got a version of the code of continuation as below:

Clear[continuation];
continuation[mat_, order_] := 
 Module[{DiagtoBand, orderofmat = Length@mat},

  (*DiagtoBand is used for changing diagonal index to Band parameter*)  

  DiagtoBand[i_] := 
   If[Positive[
     i], {{1, i + 1}, {order - i, order}}, {{1 - i, 1}, {order, 
      order + i}}];

  (*if the order required is less then the order of mat, 
  then we just simply ArrayPad it. On the other hand, we continue it. *)

  If[order <= orderofmat,
   ArrayPad[mat, {0, order - orderofmat}], 
   MatrixForm@
    Normal@SparseArray[
      Table[(Band @@ DiagtoBand[i]) -> 
        Tally[Diagonal[mat, i]][[;; , 1]], {i, -orderofmat + 1, 
        orderofmat - 1}], {order, order}]]]

The continuation function is now universal.

continuation[mat,9]

gives

$\small \begin{pmatrix} y+0.2 & 2 \text{t1} & 0.2 & \text{t1} & 0 & 0 & 0 & 0 & 0 \\ 2 \text{t1} & 0.2\, -y & 0 & 0.2 & 0 & 0 & 0 & 0 & 0 \\ 0.2 & 0 & y+0.2 & 2 \text{t1} & 0.2 & \text{t1} & 0 & 0 & 0 \\ \text{t1} & 0.2 & 2 \text{t1} & 0.2\, -y & 0 & 0.2 & 0 & 0 & 0 \\ 0 & 0 & 0.2 & 0 & y+0.2 & 2 \text{t1} & 0.2 & \text{t1} & 0 \\ 0 & 0 & \text{t1} & 0.2 & 2 \text{t1} & 0.2\, -y & 0 & 0.2 & 0 \\ 0 & 0 & 0 & 0 & 0.2 & 0 & y+0.2 & 2 \text{t1} & 0.2 \\ 0 & 0 & 0 & 0 & \text{t1} & 0.2 & 2 \text{t1} & 0.2\, -y & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0.2 & 0 & y+0.2 \\ \end{pmatrix}$

$\endgroup$
  • $\begingroup$ You might be able to do better with FindLinearRecurrence than with the Tally approach. In any case, glad to see you've come up with something you can use. $\endgroup$ – bill s Dec 16 '14 at 4:09
  • $\begingroup$ @bills Thank you for suggesting FindLinearRecurrence. But I found that FindLinearRecurrence needs at least 5 elements in a list. So I think I just stick with Tally approach which is easy and understandable. $\endgroup$ – matheorem Dec 16 '14 at 6:08
1
$\begingroup$

The functions Band and SparseArray may be what you are looking for:

n = {9, 9}; 
Normal[SparseArray[{Band[{1, 1}] -> y + 0.2, Band[{1, 3}] -> 0.2, 
    Band[{1, 2}, n] -> {2 t1, 0}, Band[{3, 1}, n] -> {t1, 0}},  n]] // MatrixForm

Just increase the dimensions in the variable n and the specified pattern(s) continue.

$\endgroup$
  • $\begingroup$ Thank you! I know band function. But you misunderstood me. I want a function continuation which can automatically analyze any square matrix mat we feed to it, and give general version continuation[mat]? $\endgroup$ – matheorem Dec 15 '14 at 6:19
  • $\begingroup$ What you gave is a manual version. $\endgroup$ – matheorem Dec 15 '14 at 6:27
  • $\begingroup$ So -- you want a function that's like FindSequenceFunction but works on matrices as well? $\endgroup$ – bill s Dec 15 '14 at 14:29

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.