C#实现将一个矩阵分解为对称矩阵与反称矩阵之和的方法

本文实例讲述了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();
}

运行效果如下图所示:

希望本文所述对大家的C#程序设计有所帮助。

(0)

相关推荐

  • C#检测两个矩阵是否相等的方法

    本文实例讲述了C#检测两个矩阵是否相等的方法.分享给大家供大家参考.具体分析如下: 该方法并不检测矩阵中没一个单元格的值是否相等,因为其类型是double,只是检测单元格的值是否接近,double也不能判断相等. static bool areMatricesEqual(double[][] matrixOne,double[][] matrixTwo,double delta) { int aRows = matrixOne.Length; int bCols = matrixTwo[0].L

  • C#中矩阵运算方法实例分析

    本文实例讲述了C#中矩阵运算方法.分享给大家供大家参考.具体分析如下: 一.测试环境: 主机:XP 开发环境:VS2008 二.功能: 在C#中实现矩阵运算 三.源代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using Sy

  • C#判断一个矩阵是否为对称矩阵及反称矩阵的方法

    本文实例讲述了C#判断一个矩阵是否为对称矩阵及反称矩阵的方法.分享给大家供大家参考.具体如下: 1.判断对称矩阵 对任意i和j,有a[i,j]=a[j,i] /// <summary> /// 检查一个矩阵是否为对称矩阵 /// </summary> /// <param name="matrix">矩阵</param> /// <returns>true:是对称矩阵 false:不是对称矩阵</returns>

  • C#计算矩阵的逆矩阵方法实例分析

    本文实例讲述了C#计算矩阵的逆矩阵方法.分享给大家供大家参考.具体如下: 1.代码思路 1)对矩阵进行合法性检查:矩阵必须为方阵 2)计算矩阵行列式的值(Determinant函数) 3)只有满秩矩阵才有逆矩阵,因此如果行列式的值为0(在代码中以绝对值小于1E-6做判断),则终止函数,报出异常 4)求出伴随矩阵(AdjointMatrix函数) 5)逆矩阵各元素即其伴随矩阵各元素除以矩阵行列式的商 2.函数代码 (注:本段代码只实现了一个思路,可能并不是该问题的最优解) /// <summary

  • C#实现矩阵加法、取负、数乘、乘法的方法

    本文实例讲述了C#实现矩阵加法.取负.数乘.乘法的方法.分享给大家供大家参考.具体如下: 1.几个基本函数 1)判断一个二维数组是否为矩阵:如果每行的列数都相等则是矩阵,没有元素的二维数组是矩阵 /// <summary> /// 判断一个二维数组是否为矩阵 /// </summary> /// <param name="matrix">二维数组</param> /// <returns>true:是矩阵 false:不是矩阵

  • C#实现矩阵乘法实例分析

    本文实例讲述了C#实现矩阵乘法的方法.分享给大家供大家参考.具体如下: static double[][] MatrixMultiplication(double[][] matrixOne, double[][] matrixTwo) { int aRows = matrixOne.Length; int aCols = matrixOne[0].Length; int bRows = matrixTwo.Length; int bCols = matrixTwo[0].Length; if

  • C#实现矩阵转置的方法

    本文实例讲述了C#实现矩阵转置的方法.分享给大家供大家参考.具体如下: 1.转置函数 /// <summary> /// 求一个矩阵的转置矩阵 /// </summary> /// <param name="matrix">矩阵</param> /// <returns>转置矩阵</returns> private static double[][] MatrixTranspose(double[][] matri

  • C#计算矩阵的秩实例分析

    本文实例讲述了C#计算矩阵的秩的方法.分享给大家供大家参考.具体如下: 1.代码思路 计算矩阵的秩,即把矩阵进行行初等变换,得出的行最简矩阵的非零行数.过程如下 1)将矩阵各行按第一个非零元素出现的位置升序排列(Operation1函数) 2)查看矩阵是否为行最简矩阵(isFinished函数),是则到第6步,不是则到第3步 3)如果有两行第一个非零元素出现的位置相同,则做消法变换,让下面行的第一个非零元素位置后移(Operation2函数) 4)将矩阵各行按第一个非零元素出现的位置升序排列(O

  • C#实现将一个矩阵分解为对称矩阵与反称矩阵之和的方法

    本文实例讲述了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

  • Python实现将一个正整数分解质因数的方法分析

    本文实例讲述了Python实现将一个正整数分解质因数的方法.分享给大家供大家参考,具体如下: 遇到一个python编程联系题目:将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. 版本一: 开始,没动脑子就开始写了,结果如下代码 #! /usr/bin/python # 014.py import math number = int(raw_input("Enter a number: ")) while number != 1: for i in range(1,

  • 基于随机梯度下降的矩阵分解推荐算法(python)

    SVD是矩阵分解常用的方法,其原理为:矩阵M可以写成矩阵A.B与C相乘得到,而B可以与A或者C合并,就变成了两个元素M1与M2的矩阵相乘可以得到M. 矩阵分解推荐的思想就是基于此,将每个user和item的内在feature构成的矩阵分别表示为M1与M2,则内在feature的乘积得到M:因此我们可以利用已有数据(user对item的打分)通过随机梯度下降的方法计算出现有user和item最可能的feature对应到的M1与M2(相当于得到每个user和每个item的内在属性),这样就可以得到通

  • 使用tensorflow实现矩阵分解方式

    采用最小二乘的求逆方法在大部分情况下是低效率的.特别地,当局镇非常大时效率更低.另外一种实现方法是矩阵分解,此方法使用tensorflow内建的Cholesky矩阵分解法.Cholesky矩阵分解法把一个矩阵分解为上三角矩阵和下三角矩阵,L和L'.求解Ax=b,改写成LL'=b.首先求解Ly=b,然后求解L'x=y得到系数矩阵. 1. 导入编程库,初始化计算图,生成数据集.接着获取矩阵A和b. >>> import matplotlib.pyplot as plt >>>

  • python 判断矩阵中每行非零个数的方法

    如下所示: # -*- coding: utf-8 -*- # @Time : 2018/5/17 15:05 # @Author : Sizer # @Site : # @File : test.py # @Software: PyCharm import time import numpy as np # data = np.array([ # [5.0, 3.0, 4.0, 4.0, 0.0], # [3.0, 1.0, 2.0, 3.0, 3.0], # [4.0, 3.0, 4.0,

  • numpy 对矩阵中Nan的处理:采用平均值的方法

    尽管我们可以将所有的NaN替换成0,但是由于并不知道这些值的意义,所以这样做是个下策.如果它们是开氏温度,那么将它们置成0这种处理策略就太差劲了. 下面我们用平均值来代替缺失值,平均值根据那些非NaN得到. from numpy import * datMat = mat([[1,2,3],[4,Nan,6]]) numFeat = shape(datMat)[1] for i in range(numFeat): meanVal = mean(datMat[nonzero(~isnan(dat

  • C# BitArray(点矩阵)转换成int和string的方法实现

    BitArray的基础可以看菜鸟编程 BitArray 类管理一个紧凑型的位值数组,它使用布尔值来表示,其中 true 表示位是开启的(1),false 表示位是关闭的(0). 当您需要存储位,但是事先不知道位数时,则使用点阵列.您可以使用整型索引从点阵列集合中访问各项,索引从零开始. BitArray 类的方法和属性 下表列出了 BitArray 类的一些常用的 属性: 属性 描述 Count 获取 BitArray 中包含的元素个数. IsReadOnly 获取一个值,表示 BitArray

  • Java将一个正整数分解质因数的代码

    程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: 1.如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可. 2.如果n <> k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你,重复执行第一步. 3.如果n不能被k整除,则用k+1作为k的值,重复执行第一步. 程序设计: public class exp2{ public exp2(){} public void fengjie(int n){ for(int i=2;i<=

  • Java利用移位运算将int型分解成四个byte型的方法

    package 移位运算; public class 移位运算 { public static void main(String[] args) { //00000111 01011011 11001101 00010101 int n=123456789; //n为需要进行移位处理的32位int型初始值 byte[] a =chai(n); for (int i = 0; i < a.length; i++) { byte b=a[i]; System.out.print(b+" &qu

随机推荐