zoukankan      html  css  js  c++  java
  • C# 矩阵计算

    private void button3_Click(object sender, EventArgs e)
            {
                double[] arrDataA = new double[2] {    3, 4 };
                double[,] arrDataB = new double[2,2]{ {1,2},
                                                      {2,3}
                                                    };
                
                Matrix a = new Matrix(arrDataA);
                Matrix b = new Matrix(arrDataA);
                Matrix c;
                c = a + b;
                Console.WriteLine("A + B  :" + c.ToString());            
                c = a - b;
                Console.WriteLine("A - B  :" + c.ToString());
                Console.WriteLine("A == B  :" + (a == b).ToString());
                b = new Matrix(arrDataB);
                Console.WriteLine("A == B  :" + (a == b).ToString());
                c = a * b;
                Console.WriteLine("A * B  :" + c.ToString());
            }
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ProgressTest
    {
        /// <summary>
        /// 矩阵类
        /// </summary>
        /// <remarks>
        /// 孙继磊,2010-10-18
        /// sun.j.l.studio@gmail.com
        /// </remarks>
        public sealed class Matrix
        {
            int row, column;            //矩阵的行列数
            double[,] data;            //矩阵的数据
    
            #region 构造函数
            public Matrix(int rowNum, int columnNum)
            {
                row = rowNum;
                column = columnNum;
                data = new double[row, column];
            }
            public Matrix(double[,] members)
            {
                row = members.GetUpperBound(0) + 1;
                column = members.GetUpperBound(1) + 1;
                data = new double[row, column];
                Array.Copy(members, data, row * column);
            }
            public Matrix(double[] vector)
            {
                row = 1;
                column = vector.GetUpperBound(0) + 1;
                data = new double[1, column];
                for (int i = 0; i < vector.Length; i++)
                {
                    data[0, i] = vector[i];
                }
            }
            #endregion
    
    
            #region 属性和索引器
            public int rowNum { get { return row; } }
            public int columnNum { get { return column; } }
    
            public double this[int r, int c]
            {
                get { return data[r, c]; }
                set { data[r, c] = value; }
            }
            #endregion
    
    
            public override string ToString()
            {
                string strRet = "";
                for(int i=0;i<row;i++)
                    for (int j = 0; j < column; j++)
                    {
                        strRet +=  data[i,j] + " , ";
                    }
                return strRet;
            }
            #region 转置
            /// <summary>
            /// 将矩阵转置,得到一个新矩阵(此操作不影响原矩阵)
            /// </summary>
            /// <param name="input">要转置的矩阵</param>
            /// <returns>原矩阵经过转置得到的新矩阵</returns>
            public static Matrix transpose(Matrix input)
            {
                double[,] inverseMatrix = new double[input.column, input.row];
                for (int r = 0; r < input.row; r++)
                    for (int c = 0; c < input.column; c++)
                        inverseMatrix[c, r] = input[r, c];
                return new Matrix(inverseMatrix);
            }
            #endregion
    
            #region 得到行向量或者列向量
            public Matrix getRow(int r)
            {
                if (r > row || r <= 0) throw new Exception("没有这一行。");
                double[] a = new double[column];
                Array.Copy(data, column * (row - 1), a, 0, column);
                Matrix m = new Matrix(a);
                return m;
            }
            public Matrix getColumn(int c)
            {
                if (c > column || c < 0) throw new Exception("没有这一列。");
                double[,] a = new double[row, 1];
                for (int i = 0; i < row; i++)
                    a[i, 0] = data[i, c];
                return new Matrix(a);
            }
            #endregion
    
            #region 操作符重载  + - * / == !=
            public static Matrix operator +(Matrix a, Matrix b)
            {
                if (a.row != b.row || a.column != b.column)
                    throw new Exception("矩阵维数不匹配。");
                Matrix result = new Matrix(a.row, a.column);
                for (int i = 0; i < a.row; i++)
                    for (int j = 0; j < a.column; j++)
                        result[i, j] = a[i, j] + b[i, j];
                return result;
            }
    
            
            public static Matrix operator -(Matrix a, Matrix b)
            {
                return a + b * (-1);
            }
    
            public static Matrix operator *(Matrix matrix, double factor)
            {
                Matrix result = new Matrix(matrix.row, matrix.column);
                for (int i = 0; i < matrix.row; i++)
                    for (int j = 0; j < matrix.column; j++)
                        matrix[i, j] = matrix[i, j] * factor;
                return matrix;
            }
            public static Matrix operator *(double factor, Matrix matrix)
            {
                return matrix * factor;
            }
    
            //a 行元素 * b 列元素
            //a 列数 == b行数
            public static Matrix operator *(Matrix a, Matrix b)
            {
                if (a.column != b.row)
                    throw new Exception("矩阵维数不匹配。");
                Matrix result = new Matrix(a.row, b.column);
                for (int i = 0; i < a.row; i++)
                    for (int j = 0; j < b.column; j++)
                        for (int k = 0; k < a.column; k++)
                            result[i, j] += a[i, k] * b[k, j];
    
                return result;
            }
            public static bool operator ==(Matrix a, Matrix b)
            {
                if (object.Equals(a, b)) return true;
                if (object.Equals(null, b))
                    return a.Equals(b);
                return b.Equals(a);
            }
            public static bool operator !=(Matrix a, Matrix b)
            {
                return !(a == b);
            }
            public override bool Equals(object obj)
            {
                if (obj == null) return false;
                if (!(obj is Matrix)) return false;
                Matrix t = obj as Matrix;
                if (row != t.row || column != t.column) return false;
                return this.Equals(t, 10);
            }
            /// <summary>
            /// 按照给定的精度比较两个矩阵是否相等
            /// </summary>
            /// <param name="matrix">要比较的另外一个矩阵</param>
            /// <param name="precision">比较精度(小数位)</param>
            /// <returns>是否相等</returns>
            public bool Equals(Matrix matrix, int precision)
            {
                if (precision < 0) throw new Exception("小数位不能是负数");
                double test = Math.Pow(10.0, -precision);
                if (test < double.Epsilon)
                    throw new Exception("所要求的精度太高,不被支持。");
                for (int r = 0; r < this.row; r++)
                    for (int c = 0; c < this.column; c++)
                        if (Math.Abs(this[r, c] - matrix[r, c]) >= test)
                            return false;
    
                return true;
            }
            #endregion
        }
    }
  • 相关阅读:
    mysql索引
    mysql锁机制
    mysql授权
    mysql执行计划
    mysql知识补遗
    求助:springboot调用存储过程并使用了pagehelper分页时报错com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException
    java面试题1
    Yarn
    MapRudecer
    Hive数据倾斜和解决办法
  • 原文地址:https://www.cnblogs.com/profession/p/5254719.html
Copyright © 2011-2022 走看看