MyMathLib系列(向量及矩阵--准备工作)

因为向量和矩阵的计算工作量比较大,为了更好的书写代码,这里增加了几个定义类,这些定义或者扩展方法将在以后的代码中应用到:
1、公共枚举类型

/*
   文件:PublicEnums.cs
 * 目的:定义公共枚举类型.
 */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MyMathLib
{
    /// <summary>
    /// 初等变换类型(课本上是加,这里是减,仅仅是个系数符号的区别.
    /// </summary>
    public enum BasicTransMethod
    {
        /// <summary>
        /// 交换i< == >j
        /// </summary>
        Swap,
        /// <summary>
        /// 乘以非零数:i=i*M
        /// </summary>
        Multipler,
        /// <summary>
        /// 第i行减去第j行乘以一个系数:i=i-j*M
        /// </summary>
        CoPlus1,
        /// <summary>
        /// 第i行乘以系数减去第j行乘以一个系数:i=i*M1 - j*M2
        /// </summary>
        CoPlus2

    }
    /// <summary>
    /// 行变换还是列变换.
    /// </summary>
    public enum TransRowOrCol
    {
        /// <summary>
        /// 行
        /// </summary>
        Row,
        /// <summary>
        /// 列
        /// </summary>
        Col
    }

    public static class ConstDef
    {
        public const int Decimals = 15;
    }

    public enum SolutionType
    {
        /// <summary>
        /// 无解
        /// </summary>
        None,
        /// <summary>
        /// 只有零解
        /// </summary>
        OnlyZero,
        //仅有一个非零解
        OnlyOne,
        /// <summary>
        /// 有很多解.
        /// </summary>
        Many
    }
}

2、方程求解结果

/*
 * SolutionOfEquation.cs
 * Added by Hawksoft.
 */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MyMathLib
{
    /// <summary>
    /// 方程解结果,用于方程组求解后的结果存放.
    /// </summary>
    public class SolutionOfEquation
    {
        /// <summary>
        /// 解类型
        /// </summary>
        public SolutionType SolutionType{ get; set; }
        /// <summary>
        /// 解向量
        /// </summary>
        public List<double[]> SolutionVectors { get; set; }
        /// <summary>
        /// 基本未知量
        /// </summary>
        public List<int> PrimaryUnknownVariations { get; set; }
        /// <summary>
        /// 自由未知量.
        /// </summary>
        public List<int> FreeUnknownVariations { get; set; }

        public SolutionOfEquation()
        {
            SolutionVectors = new List<double[]>();
            PrimaryUnknownVariations = new List<int>();
            FreeUnknownVariations = new List<int>();
        }
    }
}

3、初等变换记录项

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

namespace MyMathLib
{
    /// <summary>
    /// 初等变换记录项,用于矩阵初等变换的过程演示和矩阵求逆.
    /// </summary>
    public class TransformItem
    {
        public BasicTransMethod TransMethod { get; set; }
        public int i { get; set; }
        public int j { get; set; }
        public double M1 { get; set; }
        public double M2 { get; set; }
        public TransRowOrCol RowOrCol { get; set; }

        public static TransformItem CreateEleTransRow1(int i, int j)
        {
            return new TransformItem()
            {
                i = i,
                j = j,
                M1 = 1,
                TransMethod = BasicTransMethod.Swap,
                RowOrCol = TransRowOrCol.Row
            };
        }
        public static TransformItem CreateEleTransRow2(int i,double Multipler)
        {
            return new TransformItem()
            {
                i = i,
                j = i,
                M1 = Multipler,
                M2 = Multipler,
                TransMethod = BasicTransMethod.Multipler,
                RowOrCol = TransRowOrCol.Row
            };
        }
        public static TransformItem CreateEleTransRow3(int i, int j,double Multipler)
        {
            return new TransformItem()
            {
                i = i,
                j = j,
                M1 = Multipler,
                M2 = Multipler,
                TransMethod = BasicTransMethod.CoPlus1,
                RowOrCol = TransRowOrCol.Row
            };
        }
        public static TransformItem CreateEleTransRow4(int i, int j, double M1,double M2)
        {
            return new TransformItem()
            {
                i = i,
                j = j,
                M1 = M1,
                M2 = M2,
                TransMethod = BasicTransMethod.CoPlus2,
                RowOrCol = TransRowOrCol.Row
            };
        }
        public static TransformItem CreateEleTransCol1(int i, int j)
        {
            return new TransformItem()
            {
                i = i,
                j = j,
                M1 = 1,
                M2 = 1,
                TransMethod = BasicTransMethod.Swap,
                RowOrCol = TransRowOrCol.Row
            };
        }
        public static TransformItem CreateEleTransCol2(int i, double Multipler)
        {
            return new TransformItem()
            {
                i = i,
                j = i,
                M1 = Multipler,
                M2 = Multipler,
                TransMethod = BasicTransMethod.Multipler,
                RowOrCol = TransRowOrCol.Row
            };
        }
        public static TransformItem CreateEleTransCol3(int i, int j, double Multipler)
        {
            return new TransformItem()
            {
                i = i,
                j = j,
                M1 = 1,
                M2 = Multipler,
                TransMethod = BasicTransMethod.CoPlus1,
                RowOrCol = TransRowOrCol.Row
            };
        }
        public static TransformItem CreateEleTransCol4(int i, int j, double M1,double M2)
        {
            return new TransformItem()
            {
                i = i,
                j = j,
                M1 = M1,
                M2 = M2,
                TransMethod = BasicTransMethod.CoPlus2,
                RowOrCol = TransRowOrCol.Row
            };
        }
    }

另外说明一下:原来一直用decimal来计算,但在矩阵计算测试中发现,decimal很容易爆仓,所以改用double类型,其实decimal的位数比double多很多,但由于其特殊性,其表达的范围要比double小,所以后面改成了double.

时间: 2024-10-20 22:38:02

MyMathLib系列(向量及矩阵--准备工作)的相关文章

MyMathLib系列(向量运算--1)

主要是线性代数的第2章的算法,由于本章的大部分都是概念性的,而且后面还有矩阵,因此算法较少: /*Vector.cs * Albert.Tian on 20141225 */ using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MyMathLib { /// <summary> /// 向量相关运算,这里没有给出向量的基本变换.因为 /// 向量组可以用矩

MyMathLib系列(行列式计算4--向量部分)

1)将向量组进行消元,变换成阶梯矩阵,这是求向量组的极大线性无关组的基本算法.这个方法在前面曾经给出过,但在这里做了改进,目的是为了可以判断是否线性相关: /// <summary> /// 方程组消元,最后一列为系数,结果就在CoefficientDeterminant里. /// 本算法也可以用来求矩阵的秩. /// </summary> /// <param name="CoefficientDeterminant">方程组系数数组</p

向量与矩阵

*/--> 向量与矩阵 Table of Contents 1. 前言 2. 向量运算 2.1. 向量概述 2.2. 向量相加 2.3. 点积 dot product 2.3.1. 说明 2.3.2. 应用 2.3.3. 投影举例 2.4. 叉积 cross product 2.4.1. 说明 2.4.2. 应用 3. 矩阵 4. ref: 4.1. berkeley computer graphics resources 1 前言 本文主要会叙述向量和矩阵基本的数学运算及在图形学中的简单运用.

第四十篇 Numpy.array的基本操作——向量及矩阵的运算

No.1. Numpy.array相较于Python原生List的性能优势 No.2. 将向量或矩阵中的每个元素 + 1 No.2. 将向量或矩阵中的所有元素 - 1 No.3. 将向量或矩阵中的所有元素 * 2 No.4. 将向量或矩阵中的所有元素 / 2 或 // 2 No.5. 幂运算 No.6. 取余 No.7. 取绝对值 No.8. 三角函数 No.9. 取e的x方 No.10. 取任意数的x方 No.11. 取以e为底x的对数 No.12. 取以任意数为底x的对数 No.13. 矩阵

R语言实战-数据类型-1(标量、向量、矩阵、数组)

0.基本数据类型 数值型num,包含整形.浮点型.双精度型等所有数值类型 字符型factor,字符和字符串,因子 布尔值logi,布尔型,T,TRUE,F,FALSE 1.标量 单个的数值.字符值或者布尔值 2.向量 函数c() 1 a<-c(1,2,3,4) 2 b<-c('aa','bb','cc') 3 c<-c(TRUE,FALSE,TRUE) 访问向量的元素 []中括号中指定元素的下标 可以是单个数值,也可以是数值向量,还可以用x:y的形式指定一个范围 1 > d<

【线性代数】中的各种量理解:标量、向量、矩阵、张量

标量.向量.矩阵.张量之间的联系 在深度学习中,大家肯定都知道这几个词:标量(Scalar),向量(Vector),矩阵(Matrix),张量(Tensor).但是要是让我们具体说下他们,可能一下子找不出头绪.下面介绍一下他们之间的关系: 标量(scalar)?一个标量表示一个单独的数,它不同于线性代数中研究的其他大部分对象(通常是多个数的数组).我们用斜体表示标量.标量通常被赋予小写的变量名称. 向量(vector)?一个向量表示一组有序排列的数.通过次序中的索引,我们可以确定每个单独的数.通

MyMathLib系列(矩阵算法--2)

矩阵相关的算法比较多,也是比较重要的,而且算法之间的性能差异确实比较大,初等变换法求逆比古典法求逆快不是一点点.矩阵的计算量和数值其实都是比较大的,特别是20阶以上,我在机器上最多只搞到40阶,随机产生的矩阵,很容易就爆掉decimal和double类型. 另外,这里使用了操作符重载,后面的一元符号运算也用到了操作符重载,后面如果有时间,我会将这些算法利用这些特性统一起来,本来它们的计算就应该是统一的.特别是符号运算.如果符号运算搞完,还可以试试自动命题证明玩玩. 好了,上矩阵的菜(有点长,但基

MyMathLib系列(线性空间)

线性空间的算法不是特别多,这里是代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MyMathLib { /// <summary> /// 线性空间 /// </summary> public class LinearSpace { /// <summary> /// 求向量Vector在基底BasisOfLinearS

MyMathLib系列(一元多项式-准备)

这里定义的类TExp是基本的计算项,这里的表达式与C#自带的表达式有很大的区别,这里定义这个类主要是为了进行矩阵运算,当然本身也支持普通的运算,但目前不支持除法.这个类目前的用途主要是为了计算矩阵的特征值,特征向量,有时间,再扩展成支持常见的复数域类的数值和符号运算.代码有点长,需要有点耐心: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MyMath