基于C#编程建立泛型Matrix数据类型及对应处理方法

news2024/12/24 7:39:19

一、简介

        上一篇文档中描述了如何写一个Vector<T>类,本次在上一篇文档基础上,撰写本文,介绍如何书写一个泛型Matrix,可以应用于int、double、float等C#数值型的matrix。

        本文所描述的Matrix<T>是一个泛型,具有不同数值类型Matrix矩阵构造、新增、删除、查询、更改、深度复制、显示元素值、vector运算、扩展等功能。整体代码如下所示。

        另外,在编写Matrix<T>类时,为了调用Vector<T>类,对原先的Vector类代码,进行补充和修改。点击下载(目前正在上传,审核需要两天,如现在需要,可在评论区留下邮箱)Matrix泛型dll库及介绍!

        注:trix表示矩阵类,matrix表示矩阵。

        注:出于项目尚未结题考虑,本次代码就不公开,但会提供一个免费xmu.dll库以及dll调用的方法,里面也包含了Vector库(Vector调用方式可以参考上一篇博客)。而本博客仅仅介绍Matrix<T>的调用方法。待项目结束以后,博客在补充!

二、基本框架

2.1 建立Matrix<T>类

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

namespace XMU//.Base
{
    public class Matrix<T> where T : struct
{

     }
}

        注:<T> where T : struct中,T表示泛型,是一个占位符,可以表示C#任何数据类型,包括自定义的类型,where T : struct 表示泛型的约束,约束泛型的类型为struct,及数值型。

2.2 Matrix成员

        // 成员,存放数据
        public T[,] _data;

2.3 Matrix属性

        Matrix只包含Row、Col、DataType、private属性,分别表示矩阵的行数、列数、数据类型(int、double……)、数据类型的大小(eg:int型,对应sizeof(int))。

2.4 Matrix方法

        本博客撰写的Matrix类方法主要分为两种,一种是向量Matrix<T>的构造;一种是Matrix元素之间的操作,包括运算符(+、-、*、/、>、>=、<、<=、==、!=)重载、行/列提取、查询、扩展、求和、求最大值、求最小值、求均值、查找。

2.4.1 构造函数

        本文所写的Matrix构造函数有四种类型:构造空的matrix、根据指定维度构造全0或全1 matrix、根据数组构造matrix以及根据Vector构造matrix。

        为了便于显示Matrix元素,验证代码正确性,建议优先重写Tostring方法。

2.4.2 this[,]

        this[,] 可以根据中括号内的索引值,查询对应位置的元素。

2.4.3 Copy

        Copye方法可以在Matrix新增一个同类型的数或另一个Matrix,具体代码如下,运算符重载的基础,因此先介绍:

2.5 Matrix 运算符重载

2.5.1 +正号

        "+"正号运算符重载,返回一个全新的matrix矩阵,即每个元素乘一个+1。

函数原型:

public static Matrix<T> operator +(Matrix<T> m1)

函数说明:用来重载正号运算符

名称

说明

m1

用来进行正号运算的matrix

2.5.2 -负号

        "-"正号运算符重载,返回一个全新的matrix矩阵,即每个元素乘一个-1。

函数原型:

public static Matrix<T> operator -(Matrix<T> m1)

函数说明:用来重载负号运算符

名称

说明

m1

用来进行负号运算的matrix

2.5.3 +加法

        用于两个矩阵相加,有三种情况:矩阵+常数、常数+矩阵、矩阵+矩阵。

函数原型:

public static Matrix<T> operator +(Matrix<T> m1, Matrix<T> m2)

public static Matrix<T> operator +(Matrix<T> m1, T value)

public static Matrix<T> operator +(T value, Matrix<T> m1)

函数说明:用来重载加法运算符

名称

说明

m1

加法左边的matrix

m2

加法右边的vector

value

用来与matrix相加的数

2.5.4 -减法

        同加法一样,用于两个矩阵相减,有三种形式:矩阵-常数、常数-矩阵、矩阵-矩阵,代码如下:

函数原型:

public static Matrix<T> operator -(Matrix<T> m1, Matrix<T> m2)

public static Matrix<T> operator -(Matrix<T> m1, T value)

public static Matrix<T> operator -(T value, Matrix<T> m1)

函数说明:用来重载减法运算符

名称

说明

v1

减法左边的matrix

v2

减法右边的matrix

value

用来与matrix相减的数

2.5.4 乘法

        同加减法一样,用于矩阵相乘,有三种情况:矩阵*常数、常数*矩阵、矩阵*矩阵。(注:矩阵点乘在后面讲解)。

函数原型:

public static Matrix<T> operator *(Matrix<T> m1, Matrix<T> m2)

public static Matrix<T> operator *(Matrix<T> m1, T value)

public static Matrix<T> operator *(T value, Matrix<T> m1)

函数说明:用来重载乘法运算符

名称

说明

v1

乘法左边的matrix

v2

乘法右边的matrix

value

用来与matrix相乘的数

2.5.5 大于>

        大于>运算符用于比较常数与矩阵的比较,有三种情况:常数>矩阵、矩阵>常数、矩阵>矩阵。

        注:矩阵“>”必须与小于号“<”成对出现(重载)。

函数原型:

public static bool[,] operator >(Matrix<T> m1, T Value)

public static bool[,] operator >( T Value, Matrix<T> m1)

public static bool[,] operator >(Matrix<T> m1, Matrix<T> m2)

函数说明:用来比较矩阵与矩阵/数的大小

名称

说明

m1

matrix1

m2

matrix2

value

用来与matrix相比的数

2.5.6 小于<

        同大于号一样情况。

函数原型:

public static bool[,] operator <(Matrix<T> m1, T Value)

public static bool[,] operator <( T Value, Matrix<T> m1)

public static bool[,] operator <(Matrix<T> m1, Matrix<T> m2)

函数说明:用来比较矩阵与矩阵/数的大小

名称

说明

m1

matrix1

m2

matrix2

value

用来与matrix相比的数

2.5.7 大于等于

函数原型:

public static bool[,] operator >=(Matrix<T> m1, T Value)

public static bool[,] operator >=( T Value, Matrix<T> m1)

public static bool[,] operator >=(Matrix<T> m1, Matrix<T> m2)

函数说明:用来比较矩阵与矩阵/数的大小

名称

说明

m1

matrix1

m2

matrix2

value

用来与matrix相比的数

2.5.8小于等于

public static bool[,] operator <=(Matrix<T> m1, T Value)

public static bool[,] operator <=( T Value, Matrix<T> m1)

public static bool[,] operator <=(Matrix<T> m1, Matrix<T> m2)

函数说明:用来比较矩阵与矩阵/数的大小

名称

说明

m1

matrix1

m2

matrix2

value

用来与matrix相比的数

2.5.9 等于

函数原型:

public static bool[,] operator ==(Matrix<T> m1, T Value)

public static bool[,] operator ==( T Value, Matrix<T> m1)

public static bool[,] operator ==(Matrix<T> m1, Matrix<T> m2)

函数说明:用来比较矩阵与矩阵/数的大小

名称

说明

m1

matrix1

m2

matrix2

value

用来与matrix相比的数

2.5.10不等于

3.1.11 != 不等于

函数原型:

public static bool[,] operator !=(Matrix<T> m1, T Value)

public static bool[,] operator !=( T Value, Matrix<T> m1)

public static bool[,] operator !=(Matrix<T> m1, Matrix<T> m2)

函数说明:用来比较矩阵与矩阵/数的大小

名称

说明

m1

matrix1

m2

matrix2

value

用来与matrix相比的数

2.6 其它公共方法

2.6.1 GetRow

        获取矩阵某一行。

函数原型:

public Vector<T> GetRow(int rowIndex)

函数说明:该方法是用来在获取矩阵rowIndex对应的行。

名称

说明

rowIndex

用来提取的行索引

2.6.2 GetCol

        获取矩阵某一列。

函数原型:

public Vector<T> GetCol(int colIndex)

属性说明:该方法是用来在获取矩阵rowIndex对应的列。

名称

说明

rowIndex

用来提取的列索引

2.6.3 SetRow

        更改矩阵某一行数据。

函数原型:

public void SetRow(Vector<T> v, int rowIndex = 0)

函数说明:表示需要将v替换矩阵中rowIndex多对应的行。

名称

说明

v

需要替换的向量

rowIndex

表示需要替换的行,默认为0

2.6.4 SetCol

        更改矩阵某一列数据。

函数原型:

public void SetCol(Vector<T> v, int colIndex = 0)

函数说明:表示需要将v替换矩阵中rowIndex多对应的列。。

名称

说明

v

需要替换的向量

colIndex

表示需要替换的列,默认为0

2.6.5 Transposition

        将矩阵进行转置处理。

函数原型:

public Matrix<T> Transposition()

函数说明:表示矩阵的转置

2.5.6 ExtractRow

        根据多个int[]数组索引,提取矩阵对应的行。

函数原型:

public Matrix<T> ExtractRow(int[] indexs)

函数说明:根据int索引数组,提取矩阵的对应的所有行数。

名称

说明

indexs

int索引数组

2.5.7 ExtractCol

        根据多个int[]数组索引,提取矩阵对应的列。

函数原型:

public Matrix<T> ExtractCol(int[] indexs)

函数说明:根据int索引数组,提取矩阵的对应的所有列数。

名称

说明

indexs

int索引数组

2.5.8 DelRow

        根据int数、多个int[]数组索引,删除矩阵对应的行。

函数原型:

public Matrix<T> DelRow(params int[] indexs)

public Matrix<T> DelRow(int index)

函数说明:根据索引(数组),删除对应的行,得到一个新的矩阵。

名称

说明

indexs

需要删除的行索引数组

index

需要删除的行索引

2.5.9 DelCol

        根据int、多个int[]数组索引,删除矩阵对应的列。

函数原型:

public Matrix<T> DelCol(params int[] indexs)

ublic Matrix<T> DelRow(int index)

函数说明:根据索引(数组),删除对应的列,得到一个新的矩阵。

名称

说明

indexs

需要删除的列索引数组

index

需要删除的列索引

2.5.10 Unint

        与另一个矩阵进行行/列方向组合,默认行组合,默认rowUnion = true,表示行组合,反之,则表示列组合。

函数原型:

public Matrix<T> Unint(Matrix<T> m1, bool rowUnion = true)

函数说明:与另一个矩阵进行行/列方向组合,默认行组合

名称

说明

m1

需要组合的另一个矩阵

rowUnion

表示是否为行组合,默认为true;false表示列向组合

2.5.11 Repmat

        矩阵的行/列成倍数扩展,都默认为1倍,rowCopyX 表示行的倍数,colCopyX表示列的倍数。

函数原型:

public Matrix<T> Repmat(int rowCopyX = 1, int colCopyX = 1

函数说明:将矩阵按照行、列进行成倍数扩展

名称

说明

rowCopyX

行扩展的倍数,默认为1

colCopyX

列扩展的倍数,默认为1

2.5.12 Max

        求矩阵全域(maxType = 0)、每行(maxType = 1)、每列(maxType = 2)的最大值。

函数原型:

public Vector<T> Max(int maxType = 0)

函数说明:求全域最大值时,maxType=0(默认);求每行最大值时,maxType=1;求每列最大值时,maxType=2

名称

说明

maxType

求解最大值的类型,maxType = 0(默认)/1/2,分别表示全域、行、列方向最大值

2.5.13 Min

        求矩阵全域(minType = 0)、每行(minType = 1)、每列(minType = 2)的最小值。

函数原型:

public Vector<T> Min(int minType = 0)

函数说明:求全域最小值时,minType=0(默认);求每行最小值时,minType=1;求每列最小值时,minType=2

名称

说明

minType

求解最小值的类型,minType = 0(默认)/1/2,分别表示全域、行、列方向最小值

2.5.14 Sum

        求矩阵全域(sumType = 0)、每行(sumType = 1)、每列(sumType = 2)的和。

函数原型:

public Vector<T> Sum(int sumType = 0)

函数说明:求全域总和时,sumType=0(默认);求每行总和时,sumType=1;求每列总和时,sumType=2

名称

说明

sumType

求解总和的类型,sumType = 0(默认)/1/2,分别表示全域、行、列方向总和

2.5.15 Mean

        求矩阵全域(meanType = 0)、每行(meanType = 1)、每列(meanType = 2)的均值。

函数原型:

public Vector<T> Mean(int meanType = 0)

函数说明:求全域均值时,meanType=0(默认);求每行均值时,minType=1;求每列均值时,minType=2

名称

说明

meanType

求解均值的类型,meanType = 0(默认)/1/2,分别表示全域、行、列方向均值

 2.5.16 FindNumber

        求全域等于value的个数,meanType=0(默认);求每行等于value的个数,meanType=1;求每列等于value的个数,meanType=2。

函数原型:

public int[] FindNumber(T value, int findNumType = 0)

函数说明:根据findNumType的值,查找全域(findNumType=0)、每行(findNumType=1)或每列(findNumType=2)元素等于value的元素个数。

名称

说明

value

所需要查找的值

findNumType

寻找元素的方式,findNumType = 0(默认)/1/2,分别表示全域、行、列方向寻找

2.5.17 Find

        出所有元素等于value值的位置索引。

函数原型:

public int[,] Find(T value)

函数说明:查找全域元素等于value位置索引

名称

说明

value

需要查找的值

2.5.18 Data

        Data方法可以用来提取Matrix矩阵元素,或则说是量T 类型的Matrix转化T类型的数组。

函数原型:

public T[,] Data()

函数说明:将matrix元素提取出来,保存在T[,]数组上

三、验证

        调用的时候,将dll应用到工程文件的项目中,并添加:using XMU;

        可先下载dll库,里面包含了一个验证的program.cs文件。验证结果部分截图如下:

        代码暂不公开,需要的课下载封装的dll库,直接调用,若有不对或不足之处,敬请斧正。我将及时更新xmu.dll库。 

路漫漫其修远兮,吾将上下而求索!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/485130.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一个人在家怎么赚钱?普通人如何通过网络实现在家就能赚钱

近年来&#xff0c;随着互联网的飞速发展&#xff0c;嗅觉敏锐的人只要使用互联网就可以快乐地赚钱。一般来说&#xff0c;网上赚钱的投资较少&#xff0c;有时有一台能上网的电脑或手机就够了&#xff0c;所以大家有时称其为“无成本或低成本网赚”。今天就分享一个人在家如何…

23种设计模式第一章:单例模式

这里写自定义目录标题 一 单例模式1 静态常量饿汉式2 静态代码块饿汉式3 线程不安全懒汉式4 线程安全懒汉式线程安全&#xff0c;同步方法线程安全&#xff0c;同步代码块 5 doubleCheck&#xff08;双重检查&#xff0c;推荐使用&#xff09;6 静态内部类7 枚举 一 单例模式 …

K8s 安全是云安全的未来

导语 到 2025 年&#xff0c;保护 Kubernetes (K8s) 将被认为是云安全最重要的方面。 在最成功的组织中&#xff0c;CTO 和 CISO 已经意识到 Kubernetes 安全的重要性。 但是&#xff0c;虽然 Kubernetes 已经占 CTO 云支出的很大一部分&#xff0c;但 CISO 仍然有所落后。 大…

基于web的课程重难点掌握情况分析系统

1&#xff0e;系统登录&#xff1a;系统登录是用户访问系统的路口&#xff0c;设计了系统登录界面&#xff0c;包括用户名、密码和验证码&#xff0c;然后对登录进来的用户判断身份信息&#xff0c;判断是管理员用户还是普通用户。 2&#xff0e;系统用户管理&#xff1a;不管是…

19.考虑柔性负荷的综合能源系统日前优化调度模型

说明书 MATLAB代码&#xff1a;考虑柔性负荷的综合能源系统日前优化调度模型 关键词&#xff1a;柔性负荷 需求响应 综合需求响应 日前优化调度 综合能源系统 参考文档&#xff1a;《考虑用户侧柔性负荷的社区综合能源系统日前优化调度》参考柔性负荷和基础模型部分&#xf…

脑电信号特征提取方法与应用

前言 脑电图(EEG)信号在理解与脑功能和脑相关疾病的电活动方面发挥着重要作用。典型的脑电信号分析流程如下&#xff1a;(1)数据采集&#xff1b;(2)数据预处理&#xff1b;(3)特征提取&#xff1b;(4)特征选择&#xff1b;(5)模型训练与分类&#xff1b;(6)性能评估。当信号分…

SpringClouid学习笔记(正在更新中...)

目录 SpringCloud1、微服务1.1、定义1.2、特性单体应用微服务应用 1.3、微服务架构演变&#xff08;RPC&#xff09;1.4、微服务解决方案 2、SpringCloud2.1、什么是SpringCloud官方定义DemoSpringCloud版本和SpringBoot版本选择 3、环境搭建环境说明构建方式开始构建 4、服务注…

全注解下的SpringIoc 续3-属性文件的使用

在Spring Boot中使用属性文件&#xff0c;可以采用默认的application.properties文件&#xff0c;也可以使用自定义的配置文件&#xff0c;下面让我们一起来看看这两个的使用。 使用默认的application.properties文件 这个配置文件是Spring Boot默认会加载的&#xff0c;所以…

自动抓取QQ好友列表?Windows UIA教你轻松实现

目录&#xff1a;导读 引言 选择Windows UIA框架进行自动化测试的原因 查找窗口 读取QQ软件的好友列表 结语 引言 每个使用QQ的人都有自己的好友列表&#xff0c;但是如果你想要查看所有好友信息&#xff0c;手动一个个点击会非常浪费时间。那么有没有什么快速获取好友列…

【openGauss实战12】表空间管理

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

【总线】IIC学习笔记

【总线】IIC学习笔记 参考链接IIC总线介绍IIC总线时序1.空闲信号2. 启动信号与停止信号3.数据的有效性4.应答信号5.七位地址传输 IIC读写过程&#xff08;AT24C02举例&#xff09;IIC读过程IIC写过程 正点原子IIC驱动问题1、IIC停止信号问题2、IIC-AT24C02的器件地址发送的疑惑…

OJ搭建配置 功能速查手册

服务器配置 腾讯云 2H4G 5M 60GB 轻量应用服务器 承载大约 200~400人使用&#xff0c;经过压力测试&#xff0c;评测并发速度可满足130人左右的在线比赛。 系统镜像选 Ubuntu 22.04 LTS。 用户管理 一、批量导入&#xff08;从方便管理角度建议以 学生姓名 作为 用户名 &am…

网络安全之黄金票据,白银票据

前言&#xff1a;今天来给大家讲讲黄金票据和白银票据Kerberos认证#金票Golden ticket# 原理#伪造金票的场景和所需条件#利用方式#银票SILVER TICKET# 原理#伪造银票所需条件#金票和银票的区别# 获取的权限不同#认证流程不同#加密方式不同# 前言&#xff1a;今天来给大家讲讲黄…

Unity 3D 学习笔记(1)

文章目录 1.Unity 3D 概述2.Unity的安装过程3.Unity 3D 的项目管理4.Unity 3D 中的场景5.Unity 3D 的界面组成 1.Unity 3D 概述 Unity 3D简介&#xff1a;Unity 3D是虚拟现实行业中使用率较高的一款开发引擎&#xff0c;由Unity Technology公司开发。通过Unity&#xff0c;开发…

手动实现 Spring 底层机制【初始化 IOC容器+依赖注入+BeanPostProcessor 机制+AOP】

目录 手动实现 Spring 底层机制【初始化 IOC容器依赖注入BeanPostProcessor 机制AOP】 前面我们实际上已经用代码简单实现了 代码演示使用框架 创建一个maven项目 创建UserAction类 创建UserDao类 创建UserService类 创建beans.xml 说明 创建AppMain类 运行效果 如图…

《汇编语言》- 读书笔记 - 第2章-寄存器

《汇编语言》- 读书笔记 - 第2章-寄存器 2.0 8086CPU 寄存器段地址:偏移地址 2.1 通用寄存器2.2 字在寄存器中的存储2.3 几条汇编指令表2.1汇编指令举例表2.2 程序段中指令的执行情况之一问题 2.1表2.3 程序段中指令的执行情况之二问题 2.2 2.4 物理地址2.5 16位结构的CPU2.6 8…

数据埋点1

文章目录 1 什么是数据埋点2 为什么需要数据埋点3 数据埋点能采集哪些用户数据4 数据埋点的分类及方式5 主流的数据上报技术5.1 客户端上报5.2 服务端获取 1 什么是数据埋点 互联网的海量数据是通过数据埋点技术采集用户行为数据而产生的&#xff0c;用户行为数据采集及上报流…

我又不当程序员还要学Python吗?人工智能AI的出现我知道,我错了

Python&#xff08;可读音&#xff1a;派森&#xff09; 时代要淘汰你&#xff0c;连招呼都不会打&#xff01; 这句话近些年我们常在媒体上听到&#xff0c;有点残酷&#xff0c;但却又很现实。 最近&#xff0c;人工智能AI技术火爆全网&#xff0c;而且它所表现出来的“超…

浅谈Spring中的BeanFactory与FactoryBean

前言 理解FactoryBean是非常非常有必要的&#xff0c;因为在Spring中FactoryBean最为典型的一个应用就是用来创建AOP的代理对象&#xff0c;不仅如此&#xff0c;而且对理解Mybatis核心源码也非常有帮助&#xff01;如果甘愿crud&#xff0c;做个快乐的码农&#xff0c;那我就哦…

Springcloud--docker快速入门

认识docker docker相关操作 1.初识Docker 1.1.什么是Docker 微服务虽然具备各种各样的优势&#xff0c;但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中&#xff0c;依赖的组件非常多&#xff0c;不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署…