C#如何将一个矩阵分解为对称矩阵和反称矩阵之和演示例子:
1、理论依据
对任意n阶方阵A,有 A=(A+T(A))/2+(A-T(A))/2,其中T(A)是A的转置,(A+T(A))/2是一个对称矩阵,(A-T(A))/2是一个反称矩阵。
2、求出对称矩阵部分的函数
|
/// <summary> /// 把矩阵分解为对称矩阵与反称矩阵之和:对称矩阵 /// </summary> /// <param name="matrix">矩阵</param> /// <returns></returns> private
static
double [][] SymmetricPart( double [][] matrix) { //合法性校验:矩阵必须为方阵 if
( MatrixCR(matrix)[0] != MatrixCR(matrix)[1]) { throw
new
Exception( "matrix 不是一个方阵" ); } //矩阵中没有元素的情况 if
(matrix.Length == 0) { return
new
double [][] { }; } //生成一个与matrix同型的空矩阵 double [][] result = new
double [matrix.Length][]; for
( int
i = 0; i < result.Length; i++) { result[i] = new
double [matrix[i].Length]; } //对称矩阵为 (A+T(A))/2 其中A为原矩阵,T(A)为A的转置矩阵 for
( int
i = 0; i < result.Length; i++) { for
( int
j = 0; j < result.Length; j++) { result[i][j] = (matrix[i][j] + matrix[j][i]) / 2.0; } } return
result; } |
3、求出反称矩阵部分的函数
|
/// <summary> /// 把矩阵分解为对称矩阵与反称矩阵之和:反称矩阵 /// </summary> /// <param name="matrix">矩阵</param> /// <returns></returns> private
static
double [][] SkewSymmetricPart( double [][] matrix) { //合法性校验:矩阵必须为方阵 if
(MatrixCR(matrix)[0] != MatrixCR(matrix)[1]) { throw
new
Exception( "matrix 不是一个方阵" ); } //矩阵中没有元素的情况 if
(matrix.Length == 0) { return
new
double [][] { }; } //生成一个与matrix同型的空矩阵 double [][] result = new
double [matrix.Length][]; for
( int
i = 0; i < result.Length; i++) { result[i] = new
double [matrix[i].Length]; } //反称矩阵为 (A-T(A))/2 其中A为原矩阵,T(A)为A的转置矩阵 for
( int
i = 0; i < result.Length; i++) { for
( int
j = 0; j < result.Length; j++) { result[i][j] = (matrix[i][j] - matrix[j][i]) / 2.0; } } return
result; } |
4、其他函数
|
/// <summary> /// 判断一个二维数组是否为矩阵 /// </summary> /// <param name="matrix">二维数组</param> /// <returns>true:是矩阵 false:不是矩阵</returns> private
static
bool
isMatrix( double [][] matrix) { //空矩阵是矩阵 if
(matrix.Length < 1) return
true ; //不同行列数如果不相等,则不是矩阵 int
count = matrix[0].Length; for
( int
i = 1; i < matrix.Length; i++) { if
(matrix[i].Length != count) { return
false ; } } //各行列数相等,则是矩阵 return
true ; } /// <summary> /// 计算一个矩阵的行数和列数 /// </summary> /// <param name="matrix">矩阵</param> /// <returns>数组:行数、列数</returns> private
static
int [] MatrixCR( double [][] matrix) { //接收到的参数不是矩阵则报异常 if
(!isMatrix(matrix)) { throw
new
Exception( "接收到的参数不是矩阵" ); } //空矩阵行数列数都为0 if
(!isMatrix(matrix) || matrix.Length == 0) { return
new
int [2] { 0, 0 }; } return
new
int [2] { matrix.Length, matrix[0].Length }; } /// <summary> /// 打印矩阵 /// </summary> /// <param name="matrix">待打印矩阵</param> private
static
void
PrintMatrix( double [][] matrix) { for
( int
i = 0; i < matrix.Length; i++) { for
( int
j = 0; j < matrix[i].Length; j++) { Console.Write(matrix[i][j] + "\t" ); //注意不能写为:Console.Write(matrix[i][j] + '\t'); } Console.WriteLine(); } } |
5、Main函数代码和程序运行例子
|
static
void
Main( string [] args) { double [][] matrix = new
double [][] { new
double [] { 1, 2, 3 }, new
double [] { 4, 5, 6 }, new
double [] { 7, 8, 9 } }; Console.WriteLine( "原矩阵" ); PrintMatrix(matrix); Console.WriteLine( "对称矩阵" ); PrintMatrix(SymmetricPart(matrix)); Console.WriteLine( "反称矩阵" ); PrintMatrix(SkewSymmetricPart(matrix)); Console.ReadLine(); } |
运行效果图: