当前位置: 首页 > article >正文

手搓实现矩阵操作

矩阵实现

优先备注 : 我在实现矩阵类的时候,提前实现了向量类。值得注意的是,我把行向量作为主序,同样的,我把矩阵看作由多个行向量组成的向量组
另外,本代码实现的原理源于我对《线性代数》(同济大学第六版)部分知识的贮备
源代码链接 : Github
国内地址 : Gitee

向量类(Vector)

属性

属性名称类型作用本身属性
dataElement*记录向量数据,初始化时根据长度全部赋值为0.0public
lengthint记录向量长度public

方法

方法名称类型作用本身属性
Vector()默认构造函数,你会获取一个长度为1,唯一值为0.0的向量public
Vector(Element* _data, int _length = MAXLEN)可传参的构造函数,根据你传入的数据,初始化向量,如果你不指定长度,会默认为最大指定长度,并在值没传满的情况全部补全为0.0public
~Vector()析构函数public
printVec(int len=MAXLEN, bool ifself= true, int round=ROUND)void以向量形式打印,并修改终端输出样式,这三个参数分别指定了打印向量前len个数据、是否是自己在打印(被矩阵打印方法调用时需要指定false,一般不需要在意此方法)、打印当前向量数据精确到小数点后几位public
transpose()Vector*获取矩阵的转置矩阵,从1xn变成nx1形状,但是返回的是一个n个1x1向量组成向量组public
Vector(const Vector& other)拷贝函数public
isEqual(Vector & other)const bool判断两个向量一样的,即长度一样,对应索引位置数据一样public
multi(Element k)Vector获取k倍向量public
add(Vector & other)Vector获取两个向量相加后的向量public
splice(Vector & other, bool pos= true)Vector获取两个向量拼接后的向量,如果pos为true,把other拼到右侧,否则左侧public
expand(int index, Element k)Vector获取索引index扩大k倍后的向量public
unit()Vector获取单位化后的向量,但引用向量本身不能是零向量public
isZero()const bool判断一个向量是不是零向量public
transpose2(Vector *vec, int row)Vector把一个nx1的向量组转回到1xn向量,这是一个友元函数public
inner(Vector & other)const Element两个行向量做内积,但是other(即被乘向量,在右侧那个)在矩阵(或者可以说向量组)我视之为列向量的作用public
getReverseOrderNumber(Vector & vec)int把一个向量视为逆序数组,求取逆序数,这是一个友元函数public

矩阵类(Matrix)

属性

属性名称类型作用本身属性
_vecsVector[]我把矩阵看成了行向量组private
_rowint记录矩阵行数private
_columnint记录矩阵的列数private
spcSpecial标识特定矩阵,具体请见下面Special结构体private
shapeShape矩阵的形状public

方法

方法名称类型作用本身属性
Matrix(Vector * vectors, int _row, int _column)矩阵类唯一提供的构造方法,需要传入向量组、矩阵的行数或者列数public
Matrix(const Matrix & other)拷贝函数public
~Matrix()析构函数public
printMatrix(int round=ROUND)void直观的打印出矩阵,round参数可以指定矩阵数值精确到小数点后几位public
isSquare()const bool判断矩阵是不是方阵public
E()Matrix在方阵的前提下获取同形单位矩阵public
transpose()Matrix获取矩阵的转置矩阵public
isDig(bool if_main=true)bool在方阵的前提下,如果传入true,则判断矩阵是不是主对角矩阵,否则判断是不是副对角矩阵public
isSymmetric()bool在方阵的前提下,判断矩阵是不是对称矩阵(即M(i, j) == M(j, i)的矩阵)public
isEqual(Matrix & other)、==bool判断两个矩阵是不是相同矩阵,即形状一样的前提下,对应位置数据一样视为相同矩阵,同时在相同前提下,把拥有一方spc属性中true的成员传入到另一方spc属性中对应的成员public
splice(Matrix & other, Splice _splice={true, true})Matrix按模式拼接两个矩阵,模式传入请参考Splice结构体public
add(Matrix & other)、+Matrix矩阵形状一样的前提下做矩阵加法运算并返回一个新矩阵public
multi(Element k)、*Matrix矩阵的数乘,返回扩大k倍的矩阵public
innerMulti(Matrix & other)、^Matrix满足内积条件的前提下做矩阵内积public
getRemainder(int row, int col)Matrix去掉row行和col列,获取剩下数据组成的余子矩阵,请注意,需要区别于余子式;传入的矩阵至少是二阶的public
det()Matrix是方阵的前提下,采用代数余子式的方法递归求取矩阵的值,一般情况的时间复杂度是O(n!)public
ifTriMatrix(bool if_up=true)bool传入true时,判断方阵是不是一个上三角矩阵,反之public
isSingularMat()bool判断方阵是不是奇异矩阵public
trace()Element获取方阵的迹public
getAccompany()Matrix使用AA* = det(A)E原理求取方阵A的伴随矩阵,逆矩阵同样使用此方法public
getAccompanyT()Matrix同样使用上面原理,采用另一种方式获取方阵A的伴随矩阵public
inv()Matrix获取非奇异矩阵的逆矩阵public
getElementaryTransposeReSize(int lr, Element k, bool if_line= true)void对矩阵本身进行初等变换——把某行(列)扩大k倍,但是除了初等变换,我还希望k可以为0,if_line为true则指定行变换,反之;if_line作用下同public
getElementaryTransposeExchange(int lr1, int lr2, bool if_line=true);void对矩阵本身进行初等变换——把两行(列)对换位置public
getElementaryTransposAdd(int lr1, int lr2, double k, bool if_line);void对矩阵本身进行初等变换——把lr2行(列)的k倍加到lr1行(列),但lr2本身不变public
Zero()Matrix获取矩阵同形状的零矩阵,但是不会继承原来的是spc属性被检测过为true的成员public
isOrthogon()bool判断方阵是不是正交矩阵public
norm(bool if_line=false)Matrix组成矩阵的向量组单位化,if_line=true决定的是行方向,反之

特殊的独立方法(Special)

方法名称类型作用文件源
printVecC(Vector* vecs, int length, int round=ROUND)void列向量专用的独立打印方式,length参数实质是形状nx1中的n,在这里,你仍然可以指定当前输出的精确小数的位置rematrix
error_models(int model)void指定报错模式auxiliary
swap_array(Element *arr1, Element *arr2, int len)void交换两个长度为len的数组交换数据auxiliary
power(int x, int y)Element只考虑整数x的正整数次幂,但是没有进行数据检测处理auxiliary
sums(Element * data, int len)Element求取长度为len的数据集的和auxiliary
copy_mat(Matrix & other)Matrix复制一个Matrix,静态方法rematrix

特殊结构(Structure)

Splice结构

Splice结构决定了拼接矩阵的方式

成员名称类型作用
if_lrbool表示是否左右拼接,如果为true,左右拼接,否则上下拼接
other_lrbool如果选择了左右拼接,传入true,则把other拼接到右侧,反之;如果选择的是上下拼接,传入true,则把other拼接到下面,反之

Shape结构

Shape结构用于标识矩阵的形状

成员名称类型作用
rowint矩阵的行数
columnint矩阵的列数

Special结构

  • Special是一个用于标识某些矩阵在运行特定方法后获取的新属性
  • 注意的是,必须是某些特殊矩阵在具有的属性(比如说,确定了这是一个对角矩阵、三角矩阵等等等)
  • 一旦一个矩阵被标识了这类属性,由此类矩阵衍生出的新矩阵可能会继承某些属性
  • 或者,在进行大量高时间复杂度计算时,特殊矩阵可以明显的降低时间复杂度,比如说使用递归求方阵的行列式值,需要O(n!)时间复杂度,而上三角矩阵只需要O(1)时间复杂度
成员名称类型作用
triUpbool是否上三角矩阵
triDownbool是否下三角矩阵
digUpbool是否主对角线矩阵
digDownbool是否副对角线矩阵
unitbool是否是的单位矩阵
symmetrybool是否是对称矩阵
  • 下列成员为true时,支持解决的方法

triUP

  • Matrix(const Matrix &other)
  • det

triDown

  • Matrix(const Matrix &other)
  • det

digUp

  • Matrix(const Matrix &other)
  • det
  • getAccompany
  • getAccompanyT
  • inv

digDown

  • Matrix(const Matrix &other)
  • det
  • inv

unit

  • Matrix(const Matrix &other)
  • tanspose
  • isDig
  • isSymmetric
  • ifTriMatrix
  • det
  • getAccompany
  • getAccompanyT
  • innerMulti
  • inv

symmetry

  • Matrix(const Matrix &other)
  • tanspose
  • isDig

特别备注
虽然有以下例子 : 如果一个矩阵是和单位矩阵(已经记录它是)相加的话,我可以更快,只使用时间复杂度为O(n)的计算方法代码来更快的运算,但是我不打算这样做。
如果诸如此类情况都考虑的话,确实可以让运算性能大幅度提升,但是有一些方法中我不打算这么做

预编译(Macro)

  • 预编译定义
宏名称作用
_GLIBCXX_REMATRIX独立库标识
Elementdouble类型的别名
MAXLEN允许向量数据传入的最大的长度,在矩阵中,代表着矩阵允许最大列数
MAXCOUNT在矩阵中,代表着矩阵允许最大行数
NEWLINE帮助快速换行
T_ERROR用于测试代码运行是否不符合预期
CHECKSUC确实是我想的那样
CHECKNOT确实不是我想的那样
elifelse if的代替
END_SUCCESSFULLY成功退出,exit(EXIT_SUCCESS)
ROUND全局,输出向量/矩阵小数精确度

http://www.kler.cn/a/15808.html

相关文章:

  • 创建vue+electron项目流程
  • ubuntu16.04配置网卡
  • 【机器学习】机器学习中用到的高等数学知识-1.线性代数 (Linear Algebra)
  • DVWA靶场通关——SQL Injection篇
  • 2024 CCF中国开源大会“开源科学计算与系统建模openSCS”分论坛成功举办
  • 微服务中的技术使用与搭配:如何选择合适的工具构建高效的微服务架构
  • 什么是阻抗?影响阻抗的因素有哪些?
  • java第三天
  • 区块链在元宇宙中的作用(二)
  • ShareSDK 抖音平台注册
  • ubuntu中安装VMware Tools,实现Windows文件拖入Ubuntu
  • Java——一维数组和二维数组(主要详讲一维数组)
  • Vivado约束添加方法:一文全面解析IO和时序约束
  • RSA算法仿真模拟
  • package.json第三方配置
  • Linux 中安装配置 LVS 实现前向代理负载均衡的步骤
  • C++linux高并发服务器项目实践 day4
  • vueuse常用hooks
  • docker登录harbor、K8s拉取镜像报http: server gave HTTP response to HTTPS client
  • Scala语言入门以及基本语法
  • 【Java入门合集】第二章Java语言基础(一)
  • 简单认识 Postman界面操作
  • 千耘导航让普通棉农享受到科技红利
  • 多维评测指标解读2022MSU世界编码器大赛结果
  • 考研拓展:汇编基础
  • Python 多线程实例