TransWikia.com

How can I define a function using ArrayFlatten without using SetDelayed?

Mathematica Asked by valar morghulis on February 3, 2021

I created a matrix F2 using SparseArray and ArrayFlatten as follows:

f0[x_, y_] = (3 - (Cos[x] + Cos[y])) PauliMatrix[0] + 5 PauliMatrix[3];
nf = 2; 
F1[x_, y_] = 
  SparseArray[{Band[{1, 1}, {2 nf, 2 nf}] -> {f0[x, y]}, 
    Band[{1, 3}, {2 nf, 2 nf}] -> {7 PauliMatrix[0]}, 
    Band[{3, 1}, {2 nf, 2 nf}] -> {7 PauliMatrix[0]}}];
nt = 2;
IC = SparseArray[{{(2 nf - 1), 1} -> 1, {(2 nf), 2} -> 
     1, {(2 nf - 1), 3} -> 1, {(2 nf), 4} -> 1}, {2 nf, 4 nt}];
F2[x_, y_] = ArrayFlatten[{{F1[x, y], IC}}];    

As an example, I put nf=nt = 2. but what I have is a very large matrix. The problem now is that F2[0, 0] will not substitute x = 0 and y = 0 in the matrix. It is working if I define F2 with SetDelayed, i.e., F2[x_, y_] := ..... But I do not want to use SetDelayed because I have heavy calculations to do with F2. So how can I solve this, please?

One Answer

Use Normal to make the RHS of the definition of F2 a normal array. The formal arguments were being hidden in the SparseArray:

0[x_, y_] = (3 - (Cos[x] + Cos[y])) PauliMatrix[0] + 5 PauliMatrix[3];

nf = 2;

F1[x_, y_] = 
  SparseArray[{Band[{1, 1}, {2 nf, 2 nf}] -> {f0[x, y]}, 
    Band[{1, 3}, {2 nf, 2 nf}] -> {7 PauliMatrix[0]}, 
    Band[{3, 1}, {2 nf, 2 nf}] -> {7 PauliMatrix[0]}}];

nt = 2;

IC = SparseArray[{{(2 nf - 1), 1} -> 1, {(2 nf), 2} -> 
     1, {(2 nf - 1), 3} -> 1, {(2 nf), 4} -> 1}, {2 nf, 4 nt}];

F2[x_, y_] = Normal@ArrayFlatten[{{F1[x, y], IC}}];

F2[a, b]

(* {{8-Cos[a]-Cos[b],0,7,0,0,0,0,0,0,0,0,0},{0,-2-Cos[a]-Cos[b],0,7,0,
0,0,0,0,0,0,0},{7,0,8-Cos[a]-Cos[b],0,1,0,1,0,0,0,0,0},{0,7,0,-2-Cos[
a]-Cos[b],0,1,0,1,0,0,0,0}} *)

Answered by David Keith on February 3, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP