1
$\begingroup$

The operation KroneckerProduct[A, IdentityMatrix[m]] expands the matrix A in the following way (depending on order of A and m):

$\left( \begin{array}{cc} a & b \\ c & d \\ \end{array} \right)\to \left( \begin{array}{cccc} a & 0 & b & 0 \\ 0 & a & 0 & b \\ c & 0 & d & 0 \\ 0 & c & 0 & d \\ \end{array} \right)$

Is there a way to code the inverse operation that would shrink ("simplify") a matrix this way?

Like

$ \left( \begin{array}{cccc} a & 0 & b & 0 \\ 0 & a & 0 & b \\ c & 0 & d & 0 \\ 0 & c & 0 & d \\ \end{array} \right)\to\left( \begin{array}{cc} a & b \\ c & d \\ \end{array} \right)$

and

$\left( \begin{array}{cccc} a & b & 0 & 0 \\ c & d & 0 & 0 \\ 0 & 0 & a & b \\ 0 & 0 & c & d \\ \end{array} \right)\to \left( \begin{array}{cc} a & b \\ c & d \\ \end{array} \right)$

I also would like if it could (optionally) shrink the matrices using complex numbers this way:

$\left( \begin{array}{cccc} a & b & f & e \\ -b & a & -e & f \\ g & h & d & c \\ -h & g & -c & d \\ \end{array} \right)\to \left( \begin{array}{cc} a+i b & f+i e \\ g+i h & d+i c \\ \end{array} \right)$

Of course, not all matrices would be shrinkable.

$\endgroup$
7
  • $\begingroup$ For the first question: Does B[[1;;;;m,1;;;;m]] do what you want? $\endgroup$ Commented Jun 30, 2022 at 13:49
  • $\begingroup$ B = KroneckerProduct[A, IdentityMatrix[m]] of course. $\endgroup$ Commented Jun 30, 2022 at 13:52
  • $\begingroup$ @HenrikSchumacher well, for $\left( \begin{array}{cccc} a & 0 & c & 0 \\ 0 & a & 0 & c \\ d & 0 & b & 0 \\ 0 & d & 0 & b \\ \end{array} \right)$ it returns {{a}}... $\endgroup$ Commented Jun 30, 2022 at 13:57
  • $\begingroup$ People here generally like users to post code as Mathematica code instead of just images or TeX, so they can copy-paste it. It makes it convenient for them and more likely you will get someone to help you. You may find the meta Q&A, How to copy code from Mathematica so it looks good on this site, helpful $\endgroup$ Commented Jun 30, 2022 at 18:05
  • $\begingroup$ @MichaelE2 Mathematice code of a matrix does not look good for understanding. $\endgroup$ Commented Jun 30, 2022 at 18:07

1 Answer 1

3
$\begingroup$

You could try

m={{a,0,b,0},{0,a,0,b},{c,0,d,0},{0,c,0,d}}; 1/2*TensorContract[ArrayReshape[m,{2,2,2,2}],{2,4}] 

or

m={{a,b,0,0},{c,d,0,0},{0,0,a,b},{0,0,c,d}}; 1/2*TensorContract[ArrayReshape[m,{2,2,2,2}],{1,3}] 

This is related to the partial trace.

Edit. Here is very simple code to automatically decide whether to apply one or the other reduction. It is currently only for a fixed value of dim for simplicity:

dim=2; traceLeft[m_]:=TensorContract[ArrayReshape[m,{dim,dim,dim,dim}],{2,4}]; traceRight[m_]:=TensorContract[ArrayReshape[m,{dim,dim,dim,dim}],{1,3}]; multipleOfIdentityQ[m_]:=MatchQ[Simplify[m-1/dim*Tr[m]*IdentityMatrix[dim]],{{0...}...}]; undo[m_]:=With[{mL=traceLeft[m],mR=traceRight[m]}, Which[ multipleOfIdentityQ[mL],1/dim*mR, multipleOfIdentityQ[mR],1/dim*mL, True,"Failed"]]; 

Both

undo[{{a,0,b,0},{0,a,0,b},{c,0,d,0},{0,c,0,d}}] undo[{{a,b,0,0},{c,d,0,0},{0,0,a,b},{0,0,c,d}}] 

return {{a,b},{c,d}}.

Edit 2. Here is another version that can deal with different dimensions. The code it not meant to be bombproof. Please Clear all previous definitions before using this:

traceLeft[m_,{dL_,dR_}]:=TensorContract[ArrayReshape[m,{dL,dR,dL,dR}],{1,3}]; traceRight[m_,{dL_,dR_}]:=TensorContract[ArrayReshape[m,{dL,dR,dL,dR}],{2,4}]; multipleOfIdentityQ[m_]:=And[SquareMatrixQ[m],With[{d=Length[m]},MatchQ[Simplify[m-1/d*Tr[m]*IdentityMatrix[d]],{{0...}...}]]]; undo[m_?SquareMatrixQ,d:{dL_,dR_}]:=With[{mL=traceLeft[m,d],mR=traceRight[m,d]}, Which[multipleOfIdentityQ[mL],1/dR*mR, multipleOfIdentityQ[mR],1/dL*mL, True,"Failed"]]; undo[m_?SquareMatrixQ]:=With[{d=Length[m]},DeleteCases[Map[undo[m,{#,d/#}]&,DeleteCases[Divisors[d],1|d]],"Failed"]//If[#==={},"Failed",First[#]]&]; 

I suggest the following examples to see what this does (and what it does not do):

KroneckerProduct[IdentityMatrix[5],Array[a,{4,4}]]//undo KroneckerProduct[Array[a,{4,4}],IdentityMatrix[7]]//undo KroneckerProduct[Array[a,{4,4}],Array[b,{2,2}]]//undo KroneckerProduct[IdentityMatrix[5],IdentityMatrix[4]]//undo 

Note in particular that the last example returns neither IdentityMatrix[5] nor IdentityMatrix[4] but

{{1,0},{0,1}} 

The specification is simply ambiguous in this sense. If one knows what dimensions one is interested in, one can directly call undo[m_,d:{dL_,dR_}].

$\endgroup$
5
  • $\begingroup$ But how to make it to figure out, which ways to simplify matrix will work? $\endgroup$ Commented Jun 30, 2022 at 11:14
  • $\begingroup$ also, make it work for any order... $\endgroup$ Commented Jun 30, 2022 at 11:19
  • $\begingroup$ A $4\times4$ matrix can be simplified in two ways if we do not use complex or split-complex numbers. But for higher order it would be a greater number of ways. $\endgroup$ Commented Jun 30, 2022 at 11:47
  • 1
    $\begingroup$ Sure, that depends on the application, often one will know what the dimensions are. If you want to automate that, if Dimensions[m] == {n,n} then one can use Divisors[n] to find all the possible ways of splitting n. Why not try yourself and post a solution? $\endgroup$ Commented Jun 30, 2022 at 12:15
  • $\begingroup$ And where those divisors should be put? $\endgroup$ Commented Jun 30, 2022 at 15:22

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.