C#编写有关矩阵的操作

来源:互联网 发布:郭嘉怎么死的知乎 编辑:程序博客网 时间:2024/06/06 18:21

using System;
using System.Collections.Generic;
using System.Text;

namespace Object
{
    public class Matrix
    {
        public Matrix()
        { }

        public Matrix(double[,] matrix)
        {
            this.matrix = matrix;
        }
        double[,] matrix = new double[1, 1];//定义数组
        public double[,] GetMatrix//获取设置数组
        {
            get { return matrix; }
            set { matrix = value; }
        }
        public void Account(double[,] matrix, double[] mb, int number)//消除前排主项
        {
            for (int i = 0; i < number; i++)
            {
                for (int j = i + 1; j < number; j++)
                {
                    double temp;
                    if (matrix[j, i] != 0)
                    {
                        temp = matrix[i, i] / matrix[j, i];
                        for (int k = 0; k < number; k++)
                        {
                            matrix[j, k] = matrix[i, k] - matrix[j, k] * temp;//消元
                        }
                        mb[j] = mb[i] - mb[j] * temp;
                    }

                }
            } Console.WriteLine(mb[2].ToString());
            for (int i = 0; i < number; i++)
            {
                for (int j = 0; j < number; j++)
                {
                    Console.Write(matrix[i, j].ToString() + " ");
                }
                Console.Write(mb[i].ToString());
                Console.WriteLine();
            }
            Console.ReadLine();
        }
        public void ReAccont(double[,] matrix, double[] mb, int number)////消除后排主项
        {
            for (int i = number - 1; i >= 0; i--)
            {

                for (int j = i - 1; j >= 0; j--)
                {
                    double temp;
                    if (matrix[j, i] != 0)
                    {
                        temp = matrix[i, i] / matrix[j, i];
                        for (int k = 0; k < number; k++)
                        {
                            matrix[j, k] = matrix[i, k] - matrix[j, k] * temp;//消元

                        }
                        mb[j] = mb[i] - mb[j] * temp;
                    }
                }
            }
            for (int i = 0; i < number; i++) //输出消元后的矩阵
            {
                for (int j = 0; j < number; j++)
                {
                    Console.Write(matrix[i, j].ToString() + " ");
                }
                Console.Write(mb[i].ToString());
                Console.WriteLine();
            }
            Console.ReadLine();
            for (int i = 0; i < number; i++)
            {
                if (matrix[i, i] != 0)
                {
                    mb[i] = mb[i] / matrix[i, i];
                    matrix[i, i] = 1;
                }
                else
                {
                    mb[i] = 0;
                }
            }
            for (int i = 0; i < number; i++) //高斯-约当消去法
            {
                for (int j = 0; j < number; j++)
                {
                    Console.Write(matrix[i, j].ToString() + " /t ");
                }
                Console.Write(mb[i].ToString());
                Console.WriteLine();
            }
            Console.ReadLine();
            for (int i = 0; i < number; i++) //输出最后结果
            {
                Console.WriteLine("x" + i.ToString() + "=" + mb[i].ToString());
            }
            Console.ReadLine();
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            double[,] mat = new double[,] { 
 { 2, 2, 3, 2, 3, 8, 4, 6, 9, 10 }, 
 { 4, 7, 7, 12, 55, 6, 9, 8, 4, 65 }, 
 { -2, 4, 5, 5, 4, 6, 8, 4, 6, 9 }, 
 { 0,0,5,3,4,-4,-8,9,6,7},
 {1,5,6,8,9,7,4,6,5,2},
 {5,8,6,7,11,45,6,25,5,4},
 {5,9,8,9,77,8,16,19,20,16},
 {8,9.2,65,6.3,5,6,8,4,6,7},
 {4,5,8,12,20,65,46,35,10,1},
 {0,0,0,0,0,4,5,6,8,9}
 };
            double[] ma = new double[] { 3, 1, -7, 4, 6, 8, 9, 5, 12, 4 };
            Matrix m = new Matrix(mat);

            m.Account(mat, ma, 10);
            m.ReAccont(mat, ma, 10);

        }
    }
}