资源描述
C#实现将一个矩阵分解为对称矩阵与反称矩阵之和的方法
2016/1/3
转自:
作者:北风其凉 字体:[增加 减小] 类型:转载 时间:2015-08-12 我要评论
这篇文章主要介绍了C#实现将一个矩阵分解为对称矩阵与反称矩阵之和的方法,较为详细的分析了矩阵分解运算的原理与C#实现技巧,需要的朋友可以参考下
本文实例讲述了C#实现将一个矩阵分解为对称矩阵与反称矩阵之和的方法。分享给大家供大家参考。具体如下:
1. 理论依据
因为反对称矩阵满足 A^T = -A
设A = (aij)
则有 aii = -aii
所以 aii = 0.
即主对角线上元素全为0.
对任意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();
}
运行效果如下图所示:
希望本文所述对大家的C#程序设计有所帮助。
为什么要研究对称矩阵与反对称矩阵的性质与应用?
先说对称矩阵吧.
可以从代数和几何两个方面上来讲.
代数方面,首先每个对称矩阵A唯一对应于一个二次型x'Ax.因此对称矩阵对二次型的研究有着重要的作用.二次型是什么呢?从代数角度上讲,他是一个函数.是n唯向量x到"数"的映射.因此研究对称矩阵有助于研究二次型,进而,在二次型的概念下.可以对矩阵进行合同分类(如同在线性变换的概念下对矩阵进行相似分类一样).我们以前学习过矩阵的相似,他把具有相同性质的矩阵划归到了一起,例如两个矩阵相似他们的行列式\迹和特征值都分别相等.合同也是为了将矩阵分类,比如正定,负定矩阵.我要说的是研究对称矩阵本身是为了在合同的代数概念下对矩阵进行一个分类,合同这种概念由于是从二次型那里来的所以只对对称矩阵产生作用.
从几何的角度上讲,一个对称矩阵对应的二次型,与距离空间(常叫做欧氏空间)联系在一起.我们高中知识知道如果选自然基底,那么向量x的长度就是他坐标的内积x'x.根据矩阵乘法的定义我们可以用二次型表示长度为x'Ex其中E是单位矩阵.由于实际应用的需要或是理论研究的推广,我们往往不能选到自然基底,甚至是标准正交的基底..那么对于一般的基底而言,这个向量x的坐标就不是x而是y了,他的长度就可以表示成y'Ay的形式,用线性代数坐标变换的知识可以证明A是一个对称矩阵.写了这么多,就是要说对称矩阵与欧式空间中长度的概念密不可分.
继续深入欧式空间,我们知道"直角坐标系"下的欧式空间距离的概念是||x-y||,也就是(x-y)'(x-y)这又与上边的长度一样,与对称矩阵密不可分了.
综上,对称矩阵是二次型和合同概念的基础,是欧式空间的需要.只有在对称矩阵的基础上欧式空间才有意义.这就直接涉及到他的应用了.理论上,实变函数和勒贝格积分都要与长度这个概念产生关系那里边叫测度,就是与欧式空间有关系.泛函分析要研究泛函的赋范空间也要与长度产生关系.因此由于欧式空间的应用广泛,导致了对称函数的研究的必要.实际应用方面,对数值分析或是最优化理论那种给方程寻找近似解或是对空间中的离散点进行曲线拟合.都会导致基底不是自然基底,所以要研究欧式空间在一般基底下的表示(就是二次型)所具有的性质,二次型建立在对称矩阵的基础之上的,所以对称矩阵的性质应用广泛.
反对称矩阵,是对二次型的又一个推广,我们把x'Ay这样的形势对应于二次型x'Ax叫做对称双线性型,叫双线性是因为他左右都乘了向量,叫对称是因为A是对称矩阵.因此对这种情况进行推广当A反称的话,我们就知道x'Ax=0(注意A反称就不是二次型了,二次型要求A对称),那么x'Ay这种形式就叫做交错双线性型.反称矩阵最常用的性质就是x'Ax=0.
2016/2/28
证明:实反对称矩阵的特征值只能是0或纯虚数
设A反称,且AX=λX,(X!=0)
则(X的共轭转置)AX=λ(X的共轭转置)X=λ|X|^2
两边取转置,并注意到A实反称,则有
-(X的共轭转置)AX=λ(X的共轭转置)X=(λ的共轭)|X|^2
两式相加得:【λ+(λ的共轭)】*|X|^2=0
因为X是特征向量,!=0,所以:【λ+(λ的共轭)】=0
证毕
一个n阶对称矩阵A负定,再叠加一对称矩阵dA,使(A+dA)矩阵正好满足半正定,如何求出该矩阵dA(理论上多少个解)
展开阅读全文