using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//自己写的一个关于矩阵各种计算的算法,还有行列式的各种算法
//简单的几步,,,嘿嘿嘿,特意分享下
namespace Task1
{
class JuZhen
{
public double[,] arr; //矩阵的成员变量
private int row, col;
public double sum = 0.0;
public JuZhen()
{ }
public JuZhen(int a, int b)
{
row = a;
col = b;
}
/*public void setRC(int a, int b)
{
row = a;
col = b;
}
public int getR()
{
return row;
}
public int getC()
{
return col;
}*/
public double[,] InputArr(int x, int y) //矩阵的输入函数,用于输入函数并且将输入的函数显示出来
{
arr = new double[x, y];
for (int a = 0; a < x; a++)
for (int b = 0; b < y; b++)
arr[a, b] = double.Parse(Console.ReadLine());
Console.WriteLine("输入的矩阵为:");
OutPrint(arr, x, y); //矩阵的显示
return arr; //返回输入的矩阵
}
public void OutPrint(double[,] x, int a, int b) //矩阵的输出函数,调用此函数实现矩阵的输出
{
for (int i = 0; i < a; i++)
{
for (int j = 0; j < b; j++)
{
Console.Write("{0} ", x[i, j]);
}
Console.WriteLine(""); //输完一行后换行
}
}
public double[,] QiuYuZiShi(double[,] x, int a) //求行列式的代数余子式矩阵,
{
double[,] temp;
double[,] result = new double[a, a];
for (int i = 0; i < a; i++) //i,m两个for循环对x矩阵遍历,求代数余子式
{
for (int m = 0; m < a; m++)
{
temp = new double[a - 1, a - 1]; //生成余子式数组
for (int j = 0; j < a - 1; j++) //j为余子式列,i为行
for (int k = 0; k < a - 1; k++)
{
if (j < i && k < m) //判断构造的元素在去掉的列前面还是后面 行的上面还是下面
temp[k, j] = x[k, j];
if (j < i && k >= m)
temp[k, j] = x[k + 1, j];
if (j >= i && k < m)
temp[k, j] = x[k, j + 1];
if (j >= i && k >= m)
temp[k, j] = x[k + 1, j + 1];
}
double s = Math.Pow(-1, i + m); //计算余子式的符号
result[i, m] = s * QiuZhi(temp, a - 1); //得代数余子式的一项
}
}
return result;
}
public double QiuZhi(double[,] x, int a) //行列式的值函数
{
double[,] temp; //声明临时矩阵数组
double s = 1.0; //用他来控制余子式的符号
double result = 0.0; //声明临时存储矩阵行列式变量和符号变量
if (a == 1)
{
return x[0, 0] * s;
}
for (int i = 0; i < a; i++)
{
temp = new double[a - 1, a - 1]; //给余子式数组分配空间
for (int j = 0; j < a - 1; j++) //j为余子式列,i为行
for (int k = 0; k < a - 1; k++)
{
if (j < i) //判断构造的元素在去掉的列前面还是后面
temp[k, j] = x[k + 1, j];
else
temp[k, j] = x[k + 1, j + 1];
}
s = Math.Pow(-1, i); //计算余子式的符号
result += x[0, i] * QiuZhi(temp, a - 1) * s; //用递归算法计算行列式的值
}
return result;
}
public void Add(double[,] x, int a, int b, double[,] y, int c, int d) //矩阵的相加并且显示相加后的结果
{
double[,] result = new double[a, b]; //将相加后的矩阵存放在result矩阵中
if (a != c || b != d) //对是否能进行乘法进行判断
Console.WriteLine("不是同型矩阵,不能进行加法运算");
else
{
for (int i = 0; i < a; i++)
for (int j = 0; j < b; j++)
result[i, j] = x[i, j] + y[i, j];
Console.WriteLine("矩阵相加后的结果为:");
OutPrint(result, a, b); //输出结果
}
}
public double[,] ZhuanZhi(double[,] x, int a, int b) //实现转置并且输出结果
{
double[,] y = new double[b, a]; //用于存放转置后的结果
for (int i = 0; i < a; i++)
for (int j = 0; j < b; j++)
y[j, i] = x[i, j];
//第a行b列与第b行a列交换,实现转置
Console.WriteLine("矩阵转置后的结果为:");
OutPrint(y, b, a);
//打印结果
return y;
}
public void Time(double[,] x, int a, int b, double[,] y, int c, int d)
{
double[,] result = new double[a, d]; //用来存放矩阵相乘后的结果
if (b != c) //判断是否能够进行矩阵的乘法运算
Console.WriteLine("x和y数组的位数不匹配,不能进行乘法运算");
else
{
for (int i = 0; i < a; i++)
for (int j = 0; j < d; j++)
{
result[i, j] = 0;
for (int k = 0; k < b; k++)
result[i, j] += (x[i, k]) * (y[k, j]); //得到相乘后的每一项
}
Console.WriteLine("矩阵相乘后的结果为:");
OutPrint(result, a, d); //打印结果
}
}
public void QiuNi(double[,] x, int a, int b) //实现矩阵的求逆运算,并输出结果
{
double[,] result1 = new double[a, b]; //用来存放代数余子式矩阵
double[,] result2 = new double[a, b]; //用来存放求逆后的矩阵
if (a != b)
Console.WriteLine("输入的行和列大小不相等,不能求逆矩阵");
else
{
double m;
m = QiuZhi(x, a); //求出行列式的模长,进行下一步的判断
if (m == 0) //判断是否有逆矩阵
Console.WriteLine("输入矩阵的模长值为0,所以它没有逆矩阵");
else
{
result1 = QiuYuZiShi(x, a); //代数余子式
double n = 1 / m;
for (int i = 0; i < a; i++) //一一求出逆矩阵的每一项
for (int j = 0; j < a; j++)
result2[i, j] = n * result1[i, j];
}
}
Console.WriteLine("矩阵求逆后的结果为:");
OutPrint(result2, a, a);
}
}
class Program
{
static void Main(string[] args)
{
double[,] arr1;
double[,] arr2;
JuZhen p = new JuZhen(); //申明一个JuZhen类的一个实例
JuZhen p1 = new JuZhen(); //给出即将输入的矩阵实例
int x1, y1;
JuZhen p2 = new JuZhen();
int x2, y2;
Console.WriteLine("请输入第一个矩阵的行"); //第一个矩阵的输入和输出
x1 = int.Parse(Console.ReadLine());
Console.WriteLine("请输入第一个矩阵的列");
y1 = int.Parse(Console.ReadLine());
Console.WriteLine("矩阵的行数为:{0},矩阵的列数为:{1}", x1, y1);
arr1 = new double[x1, y1];
arr1 = p1.InputArr(x1, y1);
Console.WriteLine("选择1继续输入第二个矩阵,您将做***加法+++乘法****\n按其他数字做矩阵的***求逆+++转置***求行列式的值**选项");
int n; //对矩阵运算的第一次选择
n = int.Parse(Console.ReadLine());
if (n == 1)
{
Console.WriteLine("请输入第二个矩阵的行和列"); //第二个矩阵的输入和输出
x2 = int.Parse(Console.ReadLine());
y2 = int.Parse(Console.ReadLine());
Console.WriteLine("矩阵的行数为:{0},矩阵的列数为:{1}", x2, y2);
arr2 = new double[x2, y2];
arr2 = p2.InputArr(x2, y2);
Console.WriteLine("输入1做+++加法+++.输入2做***乘法***");
int m;
m = int.Parse(Console.ReadLine());
switch (m)
{
case 1: p.Add(arr1, x1, y1, arr2, x2, y2); break;
case 2: p.Time(arr1, x1, y1, arr2, x2, y2); break;
default: break;
}
}
else
{
int a;
Console.WriteLine("输入1做+++求逆法+++.输入2做+++转置***输入3做求行列式的值**");
a = int.Parse(Console.ReadLine());
switch (a)
{
case 1: p.QiuNi(arr1, x1, y1); break;
case 2: p.ZhuanZhi(arr1, x1, y1); break;
case 3:
if (x1 == y1)
Console.WriteLine("行列式的值为:{0}", p.QiuZhi(arr1, x1));
else
Console.WriteLine("这不是行列式,因为行与列不相等,请重新启动程序");
break;
default: break;
}
}
Console.WriteLine("按回车键退出");
Console.Read();
}
}
}