1. 程式人生 > 其它 >反對稱實矩陣正則化

反對稱實矩陣正則化

之前構造了一個辦法來正則化反對稱實矩陣:https://www.cnblogs.com/luyi07/p/15578164.html
那個辦法只是初期嘗試做的,它有漏洞。只要反對稱實矩陣的特徵值有簡併,那個辦法就失敗。
所以現在重新做一個辦法來正則化反對稱實矩陣。

1. 反對稱實矩陣特徵值的特點

1.1 反對稱實矩陣的非0特徵值一定是純虛數

設有反厄米矩陣 \(K\),反厄米即 \(K^\dagger = -K\),可以定義

\[H = iK, \]

則有

\[H^\dagger = - i K^\dagger = i K = H, \]

\(H\) 是厄米矩陣。眾所周知,厄米矩陣的特徵值是實數,即存在么正矩陣 \(U\)

和實數對角陣 \(\Lambda\), 使得

\[H = U \Lambda U^\dagger, \]

那麼,

\[K = -i H = U(-i\Lambda) U^\dagger, \]

這說明 \((-i\Lambda)\) 的對角元是 \(K\) 的特徵值,\(U\) 的列向量是相應的本徵向量。所以 \(K\) 的非0本徵值都是純虛數。
反對稱實矩陣是反厄米矩陣的特殊情況,所以反對稱實矩陣的非0特徵值也是純虛數。

1.2 反對稱實矩陣的非0特徵值一定是兩兩一組,每組兩個特徵值互為共軛,兩個特徵向量也互為共軛

假設 \(K\) 有特徵值 \(\lambda\),有

\[K \vec{z} = \lambda \vec{z}, \]

則有

\[( K \vec{z}^* )^\dagger = (K \vec{z})^\top = \lambda \vec{z}^\top, \]

再將上式左右取厄米共軛,得到

\[K \vec{z}^* = (\lambda \vec{z}^\top)^\dagger = \lambda^* \vec{z}^*, \]

這說明,\((\lambda^*, \vec{z}^*)\) 也是一個本正對(即本徵值+本徵向量)。
前面證明了 \(\lambda\) 是純虛數,所以 \(\lambda \neq 0\) 時,\(\lambda^* \neq \lambda\)
因此,反對稱實矩陣的非零特徵值一定是兩兩一組,每組兩個特徵值互為共軛。

2. 反對稱實矩陣正則化

2.1 非0本徵值無簡併的情況

我們先討論簡單的情況,即反對稱實矩陣的非0本徵值沒有簡併,即下面的式子中 \(\lambda_i \neq \lambda_j, i\neq j\).
綜合前面的分析,任意反對稱實矩陣 \(K\) 可以寫作

\[K = [ \vec{z}_1, \vec{z}^*_1, \cdots] diag[ \lambda_1, \lambda^*_1, \cdots, \lambda_k, \lambda^*_k, 0, \cdots, 0 ] [ \vec{z}_1, \vec{z}^*_1, \cdots]^\dagger \]

其中 \(\vec{z}_1, \vec{z}^*_1, \cdots\) 為正交歸一基,且 \(K \vec{z} = \lambda \vec{z},~~ K\vec{z}^* = \lambda^* \vec{z}^*\),且 \(\lambda \neq 0\),記

\[\vec{z} = \frac{\vec{x} + i \vec{y}}{\sqrt{2}},~~~~~~~ \vec{x}, \vec{y} \in R^n \]

由歸一性,

\[\vec{z}^* \cdot \vec{z} = (\vec{x} - i \vec{y}) \cdot (\vec{x} + i \vec{y})/2 = \frac{ |\vec{x}|^2 + |\vec{y}|^2 }{2} = 1, \Rightarrow |\vec{x}|^2 + |\vec{y}|^2 = 2. \]

由於 \(\lambda \neq \lambda^*\), 所以 \(\vec{z}, \vec{z}^*\) 必須正交——注意,復向量內積定義為\((\vec{\alpha}, \vec{\beta}) = \vec{\alpha}^* \cdot \vec{\beta}\)——即

\[\vec{z} \cdot \vec{z} = 0 \Rightarrow (\vec{x} - i \vec{y}) \cdot (\vec{x} + i \vec{y}) = 0 \Rightarrow \{ \vec{x} \cdot \vec{y} = 0, \vec{x}\cdot \vec{x} - \vec{y} \cdot \vec{y} = 0 \}, \]

所以有

\[|\vec{x}| = |\vec{y}| = 1, ~~~ \vec{x} \perp \vec{y}. \]

另外

\[\left\{\vec{z}_k, \vec{z}^*_k\right\} \perp \left\{ \vec{z}_l, \vec{z}^*_l \right\} \Rightarrow \left\{ \vec{x}_k, \vec{y}_k \right\} \perp \left\{ \vec{x}_l, \vec{y}_l \right\}, \]

所以,以下基矢是正交歸一基:

\[\left\{ \vec{x}_1, \vec{y}_1, \cdots, \vec{x}_k, \vec{y}_k, \vec{w}_{2k+1}, \cdots, \vec{w}_n \right\}, \]

其中,\(\vec{w}_{2k+1}, \cdots, \vec{w}_n\) 是人為補齊的實數向量,對應值為 \(0\) 的特徵值。
這套正交歸一基有如下結構:

  • \(\left\{ \vec{x}_i, \vec{y}_i \right\}\) 構成 \(K\) 的不變子空間。
  • \(\left\{ \vec{w}_{2k+1}, \cdots, \vec{w}_n \right\}\) 構成 \(K\) 的不變子空間。

所以,如果用這套正交歸一基構造么正變換,會得到塊對角形式

\[K [ \vec{x}_1, \vec{y}_1, \cdots, \vec{x}_k, \vec{x}_y, \vec{w}_{2k+1}, \cdots, \vec{w}_n] \\ =\left[ \vec{x}_1, \vec{y}_1, \cdots, \vec{x}_k, \vec{x}_y, \vec{w}_{2k+1}, \cdots, \vec{w}_n \right] \left[ [\begin{smallmatrix} 0 & -i\sqrt{2}\lambda_1 \\ i\sqrt{2}\lambda_1 & 0 \end{smallmatrix}], \cdots, [\begin{smallmatrix} 0 & -i\sqrt{2}\lambda_k \\ i\sqrt{2}\lambda_k & 0 \end{smallmatrix}], 0, \cdots, 0 \right]. \]

由於 \(\lambda_1, \cdots, \lambda_k\) 都是純虛數,所以這樣就把 \(K\) 正則化了。

\[[ \vec{x}_1, \vec{y}_1, \cdots, \vec{x}_k, \vec{x}_y, \vec{w}_{2k+1}, \cdots, \vec{w}_n]^\top K [ \vec{x}_1, \vec{y}_1, \cdots, \vec{x}_k, \vec{x}_y, \vec{w}_{2k+1}, \cdots, \vec{w}_n] \\ = \left[ [\begin{smallmatrix} 0 & -i\sqrt{2}\lambda_1 \\ i\sqrt{2}\lambda_1 & 0 \end{smallmatrix}], \cdots, [\begin{smallmatrix} 0 & -i\sqrt{2}\lambda_k \\ i\sqrt{2}\lambda_k & 0 \end{smallmatrix}], 0, \cdots, 0 \right]. \]

2.2 非0本徵值有簡併的情況

非0本徵值有簡併的時候,就存在子空間。以2重簡併為例(更高的簡併是同理),假設 \(\lambda\) 有兩重簡併,那麼根據前面的分析,\(-\lambda\) 自然也是2重簡併。

\[K \vec{z}_1 = \lambda \vec{z}_1, ~~ K \vec{z}_2 = \lambda \vec{z}_2, ~~ \vec{z}_1 \perp \vec{z}_2, |\vec{z}_1| = |\vec{z}_2| = 1; \\ K \vec{z}_3 = -\lambda \vec{z}_3, ~~ K \vec{z}_4 = - \lambda \vec{z}_3, ~~ \vec{z}_3 \perp \vec{z}_4, |\vec{z}_3| = |\vec{z}_4| = 1.\\ K[\vec{z}_1, \vec{z}_2, \vec{z}_3, \vec{z}_4] = [\vec{z}_1, \vec{z}_2, \vec{z}_3, \vec{z}_4]diag\{\lambda, \lambda, -\lambda, -\lambda\}. \\ \vec{z}_i = (\vec{x}_i + i \vec{y}_i)/\sqrt{2}. \]

2.2.1 \(\vec{x}_i, \vec{y}_i\) 這兩個向量正交歸一

假設其對應的特徵值是 \(\mu\),則有

\[K \vec{z}_i = \mu \vec{z}_i, ~~ \Rightarrow ~~ K \vec{z}^*_i = - \mu \vec{z}^*_i, ~~ \Rightarrow ~~ \vec{z}_i \perp \vec{z}^*_i \]

因此有

\[(\vec{z}^*_i, \vec{z}_i) = \frac{1}{2}( |\vec{x}_i|^2 - |\vec{y}_i|^2 + 2i \vec{x}_i \cdot \vec{y}_i ) = 0, ~~\Rightarrow~~ |\vec{x}_i| = |\vec{y}_i|, \vec{x}_i \perp \vec{y}_i. \]

另外有歸一化條件

\[(\vec{z}_i, \vec{z}_i) = \frac{1}{2}( |\vec{x}|^2 + |\vec{y}|^2 ) = 1, \]

所以有

\[|\vec{x}_i| = |\vec{y}_i| = 1, \vec{x}_i \perp \vec{y}_i. \]

2.2.2 \(\vec{x}_1, \vec{y}_1, \vec{x}_2, \vec{y}_2\)正交

\(\vec{z}_1 \perp \vec{z}_2\),這是我們知道的;另外,由於 \(\vec{z}^*_2\) 對應 \(-\lambda\),所以也有 \(\vec{z}_1 \perp \vec{z}^*_2\);所以,自然有 \(\vec{z}_1 \perp \{ \vec{x}_2, \vec{y}_2 \}\)

另外,\(\vec{z}_1 \perp \vec{z}_2 \Rightarrow \vec{z}^*_1 \perp \vec{z}^*_2\);由於 \(\vec{z}_2\) 對應 \(\lambda\),所以也有 \(\vec{z}^*_1 \perp \vec{z}_2\);所以,有 \(\vec{z}^*_1 \perp \{\vec{x}_2, \vec{y}_2\}\)

而前面已經分析得到 \(\vec{z}_1 \perp \vec{z}^*_1\),所以有 \(\{x_1, y_1\} \perp \{\vec{x}_2, \vec{y}_2\}\)

這樣可以分析得到 \(\{ \vec{x}_1, \vec{y}_1, \vec{x}_2, \vec{y}_2\}\)是一組正交歸一實數基,張成一個不變子空間;類似地,\(\{ \vec{x}_3, \vec{y}_3, \vec{x}_4, \vec{y}_4\}\)也是一組正交歸一實數基,也可以張成同一個不變子空間。\(\vec{x}_3\) 不一定等於 \(\vec{x}_1\)\(\vec{x}_2\)

對於反對稱實矩陣的這個不變子空間,取 \(\{ \vec{x}_1, \vec{y}_1, \vec{x}_2, \vec{y}_2\}\) 這組基,即在這個子空間內完成正則化:

\[K[\vec{x}_1, \vec{y}_1, \vec{x}_2, \vec{y}_2] = [\vec{x}_1, \vec{y}_1, \vec{x}_2, \vec{y}_2] \left[ [\begin{smallmatrix} 0 & -i\sqrt{2}\lambda_1 \\ i\sqrt{2}\lambda_1 & 0 \end{smallmatrix}], [\begin{smallmatrix} 0 & -i\sqrt{2}\lambda_2 \\ i\sqrt{2}\lambda_2 & 0 \end{smallmatrix}] \right]. \]

3. 數值驗證

根據上面的理論推導,我們得到結論:只要能把反對稱實矩陣 \(K\) 對角化,就能通過實正交變換把它正則化,變為實數正則矩陣。
如何對角化反對稱實矩陣呢?GSL 有現成的函式,只是要稍微變一下。

3.1 反對稱實矩陣 \(\rightarrow\) 厄米複數矩陣

反對稱實矩陣 \(K\) 只要乘上 \(i\),就是一個厄米矩陣:

\[H = i K \Rightarrow H^\dagger = H. \]

3.2 GSL庫函式:對角化厄米複數矩陣

通過翻閱 GSL 的文件,可以發現 gsl_eigen_hermv 函式,可以對角化複數厄米矩陣。所以我寫了個函式做這個,如下。

#include<gsl/gsl_complex.h>
#include<gsl/gsl_complex_math.h>
#include<gsl/gsl_math.h>
#include<gsl/gsl_eigen.h>

#include<complex>

/*
 * GSL_eigen_hermv: given complex Hermitian matrix H[], get eigenvalues eig[] and eigenvectors eigvec[]
 * in respec to eig[i], its eigenvector is eigvec[i*n + x ], x = 0,...,n-1
 */
void GSL_eigen_hermv( int n, complex<double> * H, double * eig, complex<double> * eigvec ){

        gsl_eigen_hermv_workspace * w = gsl_eigen_hermv_alloc( n );

        gsl_matrix_complex * A = gsl_matrix_complex_alloc( n, n );
        for(int i=0;i<n;i++)
                for(int j=0;j<n;j++)
                        gsl_matrix_complex_set( A, i, j, gsl_complex_rect( H[i*n+j].real(), H[i*n+j].imag() ) );
        gsl_matrix_complex * evec = gsl_matrix_complex_alloc( n, n );
        gsl_vector * eval = gsl_vector_alloc( n );

        cout<< " gsl_eigen_herm returns "<< gsl_eigen_hermv( A, eval, evec, w );
        cout<<", it seems 0 means OK. \n";

        gsl_eigen_hermv_sort( eval, evec, GSL_EIGEN_SORT_ABS_ASC );

        for(int i=0;i<n;i++){

                double eval_i = gsl_vector_get( eval, i ); eig[i] = eval_i;
                cout<<" eigenvalue = "<<eval_i<<endl;
                gsl_vector_complex_view evec_i = gsl_matrix_complex_column( evec, i );
                gsl_vector_complex_fprintf( stdout, &evec_i.vector, "%g");

                for(int j=0;j<n;j++){
                       gsl_complex x = gsl_matrix_complex_get( evec, j, i );
                        eigvec[i*n+j].real( GSL_REAL(x) ); eigvec[i*n+j].imag( GSL_IMAG(x) );
                }

        }

        gsl_eigen_hermv_free( w );
        gsl_matrix_complex_free( A );
        gsl_vector_free( eval );
        gsl_matrix_complex_free( evec );
}

然後寫了個測試主函式,使用 GSL 文件上的實數對稱陣測試例子,進行測試。

int main(){

        double data[] = { 0.0 , 1/2.0, 1/3.0, 1/4.0,
-1/2.0, 0.0, 1/4.0, 1/5.0,
-1/3.0, -1/4.0, 0.0, 1/6.0,
-1/4.0, -1/5.0, -1/6.0, 0.0 };

        complex<double> * H = new complex<double> [ 4*4 ];
        complex<double> x; x.real(0); x.imag(1);
        cout<<" x = "<< x <<endl;
        for(int i=0;i<16;i++) H[i] = data[i] * x ;

        cout<<" H : "<<endl;
        for(int i=0;i<4;i++){
                for(int j=0;j<4;j++)cout<<H[i*4+j]<<"   "; cout<<endl;
        }

        double * eig = new double [ 4 ];

        complex<double> * eigvec = new complex<double> [ 4*4 ];

        GSL_eigen_hermv( 4, H, eig, eigvec );

        cout<<" eig: "; for(int i=0;i<4;i++)cout<<eig[i]<<","; cout<<endl;
        cout<<" eigvec: "<<endl;
        for(int i=0;i<4;i++){
                for(int j=0;j<4;j++)cout<<eigvec[i*4+j]<<","; cout<<endl;
        }

        return 0;
}

命名為 test_complex_Hermitian.cpp,進行編譯執行

g++ test_complex_Hermitian.cpp -lgsl -lgslcblas
./a.out

得到結果

 x = (0,1)
 H : 
(0,0)   (0,0.5)   (0,0.333333)   (0,0.25)   
(-0,-0.5)   (0,0)   (0,0.25)   (0,0.2)   
(-0,-0.333333)   (-0,-0.25)   (0,0)   (0,0.166667)   
(-0,-0.25)   (-0,-0.2)   (-0,-0.166667)   (0,0)   
 gsl_eigen_herm returns 0, it seems 0 means OK. 
 eigenvalue = 0.1075
-0.334421 0
0.375581 0.194331
-0.234738 -0.515822
-0.438178 0.442903
 eigenvalue = -0.1075
-0.334421 0
0.375581 -0.194331
-0.234738 0.515822
-0.438178 -0.442903
 eigenvalue = -0.736432
0.623027 0
0.2016 0.529653
-0.126 0.40367
-0.2352 0.237736
 eigenvalue = 0.736432
0.623027 0
0.2016 -0.529653
-0.126 -0.40367
-0.2352 -0.237736
 eig: 0.1075,-0.1075,-0.736432,0.736432,
 eigvec: 
(-0.334421,0),(0.375581,0.194331),(-0.234738,-0.515822),(-0.438178,0.442903),
(-0.334421,0),(0.375581,-0.194331),(-0.234738,0.515822),(-0.438178,-0.442903),
(0.623027,0),(0.2016,0.529653),(-0.126,0.40367),(-0.2352,0.237736),
(0.623027,0),(0.2016,-0.529653),(-0.126,-0.40367),(-0.2352,-0.237736),

與 GSL 文件上的參考結果一致。

3.3 自編函式:正則化反對稱實矩陣

根據前面的理論推斷,對於給定的反對稱實矩陣 \(K\),我們可以如下正則化:

  • 對角化 \(H = iK\)
  • \(H\) 的所有本徵對——即(本徵值,本徵矢)這樣的對——按本徵值的絕對值降序重排
  • 取所有特徵值大於0的特徵向量,錄用其實部向量、虛部向量:
\[\vec{x}_k = \frac{ \vec{z}_k + \vec{z}^*_k }{\sqrt{2}}, \\ \vec{y}_k = \frac{ \vec{z}_k - \vec{z}^*_k }{ \sqrt{2} i}. \]

  根據前面的理論分析,這些實部、虛部向量一定是正交歸一的。

  • 補齊正交歸一基。即補齊 \(w_{2k+1}, \cdots w_n\),使得它們與 \(\vec{x}_1, \vec{y}_1, \cdots, \vec{x}_k, \vec{y}_k\) 構成完備的正交歸一基。這一步我打算偷點懶,假定 gsl_eigen_hermv 對於0本徵值返回實數的特徵向量(試了個例子似乎確然如此),那麼就直接錄 \(\vec{z}_{2k+1}, \cdots, \vec{z}_n\)即可。

  • 最後,得到新的實數正交歸一基以後,用這些基做正交變換,得到 \(K\) 的正則形式。

寫出來的程式碼如下:

/*
 * ARMC: transform an Anti-Real-Matrix into Canonical form
 * 
 * M = U^\top Mcanonical U
 */
void ARMC( int n, double * M, double * U, double * Mcanonical ){

        complex<double> * H = new complex<double> [ n*n ];
        complex<double> x; x.real(0); x.imag(1);
        for(int i=0;i<n*n;i++) H[i] = M[i] * x ;

        double * eig = new double [ n ];

        complex<double> * eigvec = new complex<double> [ n*n ];

        GSL_eigen_hermv( n, H, eig, eigvec );

        double * xtemp = new double [n]; double * ytemp = new double [n];

        int count = 0;
        for(int i=0;i<n;i++){
                if( eig[i] > 1E-10 ){
                        for(int j=0;j<n;j++){
                                xtemp[j] = eigvec[i*n+j].real() * sqrt(2);
                                ytemp[j] = eigvec[i*n+j].imag() * sqrt(2);
                                U[count*n+j] = xtemp[j]; U[(count+1)*n+j] = ytemp[j];
                        }
                        count+=2;
                }
        }

        while( count < n ){ // eigvecs of M, with eigvalue = 0. Here I assume they are all real, thanks to GSL_eigen_hermv
                for(int j=0;j<n;j++) U[count*n+j] = eigvec[count*n+j].real();
                count++;
        }
        // UM
        double * UM = new double [ n*n ];
        for(int i=0;i<n;i++)
        for(int j=0;j<n;j++){
                double x = 0;
                for(int k=0;k<n;k++) x += U[i*n+k] * M[k*n+j];
                UM[i*n+j] = x;
        }
        // Mcanonical = (UM) * U^\top 
        for(int i=0;i<n;i++)
        for(int j=0;j<n;j++){
                double x = 0;
                for(int k=0;k<n;k++) x += UM[i*n+k] * U[j*n+k];
                Mcanonical[i*n+j] = x;
        }
        delete [] xtemp; delete [] ytemp;
        delete [] UM; delete [] eigvec; delete [] eig; delete [] H;
}

測試:

加了幾行測試輸出程式碼,正則化 12*12 反對稱陣:

0 0.0582782 0.0809623 0 0.242372 0.148711 0.0747338 0.1232 0.00109344 0.0352467 0.142309 0.0586949
-0.0582782 0 0 0.0809623 0.130991 0.0181291 0.141333 0.00607454 0.146359 -0.0488136 0.16139 0.00949629
-0.0809623 -0 0 -0.0582782 0.0488136 0.146359 -0.00607454 0.141333 -0.0181291 0.130991 -0.00949629 0.16139
-0 -0.0809623 0.0582782 0 0.0352467 -0.00109344 0.1232 -0.0747338 0.148711 -0.242372 0.0586949 -0.142309
-0.242372 -0.130991 -0.0488136 -0.0352467 0 0.17432 0.165275 0.123782 0.257831 0 0.0425534 0.19093
-0.148711 -0.0181291 -0.146359 0.00109344 -0.17432 0 -0.0727708 0.068801 0 0.257831 -0.098141 0.235799
-0.0747338 -0.141333 0.00607454 -0.1232 -0.165275 0.0727708 0 0 0.068801 -0.123782 -0.151594 -0.00598481
-0.1232 -0.00607454 -0.141333 0.0747338 -0.123782 -0.068801 -0 0 0.0727708 0.165275 -0.00598481 0.151594
-0.00109344 -0.146359 0.0181291 -0.148711 -0.257831 -0 -0.068801 -0.0727708 0 -0.17432 -0.235799 -0.098141
-0.0352467 0.0488136 -0.130991 0.242372 -0 -0.257831 0.123782 -0.165275 0.17432 0 0.19093 -0.0425534
-0.142309 -0.16139 0.00949629 -0.0586949 -0.0425534 0.098141 0.151594 0.00598481 0.235799 -0.19093 0 0
-0.0586949 -0.00949629 -0.16139 0.142309 -0.19093 -0.235799 0.00598481 -0.151594 0.098141 0.0425534 -0 0

得到

 U: 
0.24671,  -0.161599,  0.37745,  -0.362252,  0.0738795,  0.262264,  -0.0318841,  -0.00947129,  -0.129967,  -0.576762,  -0.209285,  -0.413076,  
0,  -0.0882589,  -0.135615,  0.28447,  -0.178613,  -0.461309,  0.218999,  -0.428768,  0.365394,  -0.38025,  0.159811,  -0.335772,  
0.460598,  0.380616,  0.0725851,  0.194033,  0.218767,  -0.327888,  -0.257363,  -0.160333,  -0.491176,  0.168418,  0.117501,  -0.263301,  
0,  -0.126458,  -0.16922,  -0.152371,  -0.655275,  -0.207107,  -0.343068,  -0.152547,  -0.200834,  0.0948469,  -0.5192,  0.00356828,  
-0.504934,  -0.413395,  0.17171,  -0.143605,  0.202116,  -0.0107138,  -0.17804,  -0.503161,  -0.319182,  0.165752,  0.254845,  -0.0625096,  
0,  0.231596,  0.364676,  0.363082,  -0.545472,  0.49278,  -0.00335252,  -0.203226,  -0.0834354,  -0.0172791,  0.301377,  0.0421248,  
-0.39045,  0.27596,  -0.367408,  0.185712,  0.0770305,  0.0398065,  0.00392156,  0.0623645,  -0.46218,  -0.581575,  -0.0621629,  0.186522,  
0,  0.293801,  0.299239,  -0.469542,  -0.147778,  -0.327497,  0.542638,  -0.166793,  -0.171279,  -0.0126727,  0.0426349,  0.347827,  
0.114036,  0.336157,  -0.534772,  -0.451243,  0.0233895,  0.376752,  -0.0454721,  -0.411711,  0.159359,  0.0764926,  0.14748,  -0.131655,  
0,  -0.0915267,  -0.104262,  -0.320859,  -0.305242,  -0.213516,  -0.268213,  0.444296,  -0.0574054,  -0.140221,  0.663576,  -0.0800786,  
-0.553688,  0.496246,  0.220921,  -0.0929369,  -0.0189173,  -0.0966079,  -0.0780678,  0.192486,  0.183313,  0.157824,  -0.153701,  -0.504731,  
0,  0.224926,  0.269393,  -0.0660833,  0.158604,  -0.139132,  -0.600674,  -0.192236,  0.392337,  -0.262319,  -0.0110313,  0.455335,  
 Mcanonical: 
0,  -0.707073,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  
0.707073,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  
0,  0,  0,  -0.707073,  0,  0,  0,  0,  0,  0,  0,  0,  
0,  0,  0.707073,  0,  0,  0,  0,  0,  0,  0,  0,  0,  
0,  0,  0,  0,  0,  -0.00687151,  0,  0,  0,  0,  0,  0,  
0,  0,  0,  0,  0.00687151,  0,  0,  0,  0,  0,  0,  0,  
0,  0,  0,  0,  0,  0,  0,  -0.00687151,  0,  0,  0,  0,  
0,  0,  0,  0,  0,  0,  0.00687151,  0,  0,  0,  0,  0,  
0,  0,  0,  0,  0,  0,  0,  0,  0,  -0.000784735,  0,  0,  
0,  0,  0,  0,  0,  0,  0,  0,  0.000784735,  0,  0,  0,  
0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  -0.000784735,  
0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0.000784735,  0, 

另外測試本徵值有 0 的反對稱實矩陣

0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 -0 0 -0.0582782 0.0488136 0.146359 -0.00607454 0.141333 -0.0181291 0.130991 -0.00949629 0.16139
-0 -0.0 0.0582782 0 0.0352467 -0.00109344 0.1232 -0.0747338 0.148711 -0.242372 0.0586949 -0.142309
-0.0 -0.0 -0.0488136 -0.0352467 0 0.17432 0.165275 0.123782 0.257831 0 0.0425534 0.19093
-0.0 -0.0 -0.146359 0.00109344 -0.17432 0 -0.0727708 0.068801 0 0.257831 -0.098141 0.235799
-0.0 -0.0 0.00607454 -0.1232 -0.165275 0.0727708 0 0 0.068801 -0.123782 -0.151594 -0.00598481
-0.0 -0.0 -0.141333 0.0747338 -0.123782 -0.068801 -0 0 0.0727708 0.165275 -0.00598481 0.151594
-0.0 -0.0 0.0181291 -0.148711 -0.257831 -0 -0.068801 -0.0727708 0 -0.17432 -0.235799 -0.098141
-0.0  0.0 -0.130991 0.242372 -0 -0.257831 0.123782 -0.165275 0.17432 0 0.19093 -0.0425534
-0.0 -0.0 0.00949629 -0.0586949 -0.0425534 0.098141 0.151594 0.00598481 0.235799 -0.19093 0 0
-0.0 -0.0 -0.16139 0.142309 -0.19093 -0.235799 0.00598481 -0.151594 0.098141 0.0425534 -0 0

得到

 U: 
0,  0,  -0.395163,  0.44073,  -0.117531,  -0.441911,  -0.0208166,  -0.124056,  0.0612319,  0.544158,  0.214009,  0.281114,  
0,  0,  0,  -0.250065,  -0.0198452,  0.378119,  -0.244911,  0.395889,  -0.300962,  0.484856,  -0.237043,  0.442196,  
0,  0,  -0.245674,  -0.172487,  -0.641937,  0.0870772,  0.146768,  -0.022326,  0.518727,  -0.15687,  -0.33935,  0.243605,  
0,  0,  0,  0.0782339,  0.39862,  0.335716,  0.428845,  0.264016,  0.472958,  0.00912163,  0.394059,  0.299347,  
0,  0,  0.552342,  -0.318859,  -0.166778,  0.0159522,  0.0533873,  -0.348302,  0.28037,  0.548004,  0.17742,  -0.174987,  
0,  0,  0,  0.503196,  -0.131035,  0.432106,  -0.493068,  0.169037,  0.311836,  0.101262,  0.0183059,  -0.404213,  
0,  0,  -0.422101,  -0.332344,  0.452347,  0.132859,  -0.41161,  -0.499227,  0.248035,  0.00468517,  -0.0690757,  0.0643759,  
0,  0,  0,  0.108948,  -0.342077,  0.437731,  -0.0463857,  -0.432066,  -0.346534,  -0.211698,  0.490304,  0.292186,  
0,  0,  0.547941,  0.30591,  0.144001,  -0.193388,  -0.320104,  -0.132951,  0.185184,  -0.226694,  -0.229868,  0.537939,  
0,  0,  0,  0.369557,  0.165698,  0.328366,  0.462741,  -0.392692,  -0.145453,  0.193199,  -0.545663,  -0.0598417,  
0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  
1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  
 Mcanonical: 
0,  -0.680657,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  
0.680657,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  
0,  0,  0,  -0.553307,  0,  0,  0,  0,  0,  0,  0,  0,  
0,  0,  0.553307,  0,  0,  0,  0,  0,  0,  0,  0,  0,  
0,  0,  0,  0,  0,  -0.00614115,  0,  0,  0,  0,  0,  0,  
0,  0,  0,  0,  0.00614115,  0,  0,  0,  0,  0,  0,  0,  
0,  0,  0,  0,  0,  0,  0,  -0.00304889,  0,  0,  0,  0,  
0,  0,  0,  0,  0,  0,  0.00304889,  0,  0,  0,  0,  0,  
0,  0,  0,  0,  0,  0,  0,  0,  0,  -0.000424323,  0,  0,  
0,  0,  0,  0,  0,  0,  0,  0,  0.000424323,  0,  0,  0,  
0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  
0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  

通過了測試。