# Block-diagonalization of a real skew-symmetric matrix

GROUPS:
 Luca Taddia 1 Vote Hi all,I'm in trouble with this problem. It is well known (by everyone but me, it seems) that a real skew-symmetric matrix can be put in a block-diagonal form, where the diagonal matrices are real symplectic 2x2 matrices, each one multiplied by real coefficient, linked to the original matrix eigenvalues; moreover, the transformation leading to this block-diagonal form shall be orthogonal. My question is: is there a way, using Mathematica, to explicitly get this trasformation?Thanks everyone!
5 years ago
8 Replies
 Arnoud Buzing 1 Vote Maybe you are looking for one of these matrix decomposition functions (possibly JordanDecomposition)?http://reference.wolfram.com/mathematica/guide/MatrixDecompositions.html
5 years ago
 I don't think it's any of them...
5 years ago
 Jose M. Martin-Garcia 4 Votes I think this function taking the original antisymmetric matrix will do what you need: CanonicalAntisymmetricMatrix[asmatrix : {{0 | 0.}}] := asmatrix; CanonicalAntisymmetricMatrix[asmatrix_] := With[{n = Length[asmatrix]},   If[EvenQ[n],     KroneckerProduct[      DiagonalMatrix[       Take[-I Eigenvalues[asmatrix], {1, n, 2}]], {{0, 1}, {-1, 0}}],     ArrayPad[      KroneckerProduct[       DiagonalMatrix[       Take[-I Eigenvalues[asmatrix], {1, n - 1, 2}]], {{0, 1}, {-1,         0}}], {{0, 1}, {0, 1}}]    ] /; n >= 2  ]Jose.
5 years ago
 Jose,thank you very much, but what you wrote puts the matrix in the block-diagonal form, that is a thing i was already able to do. My question is about the orthogonal transformation putting my matrix that way...
5 years ago
 Itai Seggev 4 Votes There is no builtin function which does this, but it isn't hard to construct one yourself. The basic process is quite similar to the normal diagonalization of matrices; the key point is that the real and imaginary parts of the eigenvectors are part of the same two-dimensional subspace. Thus, rather than constructing the orthogonal matrix out of eigenvectors, you use the real and imaginary parts from each complex-conjugate pair. Since the function Eigenvectors keeps the conjugate pairs together, you can do this:realDiagnolization[skew_] :=Normalize /@ Flatten[{Re[#], Im[#]}&/@ Eigenvectors[skew][[1;;-1;;2]],1]Here [[1;;-1;;2]] selects only the odd eigenvectors, Map (/@) is used to create the real and imaginary parts, Flatten is used to ensure we get n vectors (instead of n/2 pairs of vectors), and Normalize makes them all unit. You can then construct the diagnoal form as realDiagnolization[skew]. skew. Transpose[realDiagnolization[skew]]For example, consider this matrix:In[150]:= skew//MatrixFormOut[150]//MatrixForm= (0 10 10 9-10 0 8 1-10 -8 0 4-9 -1 -4 0)We have (I'm using N and Chop to create a numerical approximate that fits on a screen):In[148]:= (u=realDiagnolization[skew]//N//Chop)//MatrixFormOut[148]//MatrixForm= (-0.354501 0.411221 0.694821 0.471646-0.841859 -0.526682 -0.11781 00.189613 -0.219952 -0.371642 0.881788-0.360068 0.710721 -0.604339 0)AndIn[149]:= u . skew . Transpose[u]//Chop//MatrixFormOut[149]//MatrixForm= (0 18.1803 0 0-18.1803 0 0 00 0 0 5.610470 0 -5.61047 0)This is in fact the matrix returned by Jose's CanonicalAntisymmetricMatrix functionIn[145]:= CanonicalAntisymmetricMatrix//N//MatrixFormOut[145]//MatrixForm= (0. 18.1803 0. 0.-18.1803 0. 0. 0.0. 0. 0. 5.610470. 0. -5.61047 0.)