c++实现矩阵运算的加减法乘法以及测试用例

这篇博客介绍了如何基于C++实现一个简单的矩阵类,包括矩阵的创建、销毁、赋值、加减乘运算。作者强调了大学基础知识的重要性,并提供了线性代数学习资源。代码实现中包含了矩阵的内存管理和错误检查,以及矩阵运算的逻辑。测试部分展示了加法和乘法的使用示例。

1.引言

最近在看图像AI相关的知识,在此记录一个自己思考的代码用例。
关于矩阵的应用在AI中应用还是很广泛,尤其是深度学习的特征值这块中。
这里先简单记录上自己简单的基础矩阵算法的类,后续学习中会不断丰富这个类。
参考opencv3.4.0源码中libjasper模块中的jas_seq.c本例中增加了加减乘运算,
缩减和扩充了一些自己的理解

2.矩阵基本运算

我就是典型的:上课不听讲,考试混及格。书到用时方恨少!!
看到的同学们一定要好好的认真的学习大学知识,我现在才觉得大学学习的知识真的太有用了。
当然忘记了或者没学过的可以像我一样参考以下的视频进行学习
bilibili考研课程《线性代数》 https://www.bilibili.com/video/BV1aW411Q7x1?p=9

2.1 矩阵加减法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

主要记住以下几个点:
	1.同型矩阵指的是两个矩阵的行数和列数相等。
	2.两矩阵对应元素相加减(前提必须是同型矩阵)
	3.矩阵相乘满足:中间相等取两头

3.代码实现

	对于矩阵的赋值都采用了调用类创建矩阵时赋值或不赋值(默认参数)处理,
和接口设置所有元素为一个数,具体见如下代码。
matrix.h 矩阵类的定义
/*******************************
*	file:	matrix.h
*	author:	hehl
*	time:	2021/7/9
*******************************/
#pragma once
#include <iostream>
#include <vector>
#include <string.h>
#include <stdarg.h>
#include <stdio.h>
using namespace std;

typedef int INT;

// 基本的二维矩阵结构体
typedef struct matix_s
{
   
   
	INT	s_nRowsNums;	// 矩阵的行数
	INT	s_nColsNums;	// 矩阵的列数
	INT**	s_pRows;	// 指向矩阵每行开头的指针的指针(保存s_pData中每行的指针数组)
	INT	s_nRowsSize;	// 行数组分配大小
	INT*	s_pData;	// 矩阵的数据
	INT	s_nDataSize;	// 数据数组分配大小
	matix_s()
	{
   
   
		s_nRowsNums = 0;
		s_nColsNums = 0;
		s_pRows = nullptr;
		s_nRowsSize = 0;
		s_pData = nullptr;
		s_nDataSize = 0;
	}
} matrix_t;

class Matrix
{
   
   
public:
	// 单例
	static Matrix* GetInstance();
	// 创建矩阵,返回创建成功后矩阵的指针,失败返回nullptr  可以直接输入对应参数进行创建.仅仅用于测试
	matrix_t* matrix_create(INT nRows, INT nCols, bool bSet = false, ...);
	// 释放矩阵,释放内存
	void matrix_destroy(matrix_t* pMatrix_t);
	// 将矩阵的所有元素设置为指定值
	void matrix_setall(matrix_t* pMatrix_t, INT nValue);
	// 打印矩阵中的值
	void matrix_printf(matrix_t* pMatrix_t);
	// 两个矩阵相加
	bool two_matrix_add(matrix_t* pMatSrcA, matrix_t* pMatSrcB, matrix_t* pMatDes);
	// 两个矩阵相减
	bool two_matrix_subtrac(matrix_t* pMatSrcA, matrix_t* pMatSrcB, matrix_t* pMatDes);
	// 两个矩阵相乘
	bool two_matrix_multiply(matrix_t* pMatSrcA, matrix_t* pMatSrcB, matrix_t* pMatDes);
	// 当前有多少未释放内存的矩阵
	INT get_matix_objects_nums(void);
	// 释放当前所有未释放矩阵的内存
	void destory_all_matrix_objects(void);
private:
	// 构造函数,用于初始化
	Matrix();
	// 析构函数,用于释放内存
	~Matrix();
	// 获取矩阵行数
	INT matrix_getrows(matrix_t* pMatrix_t);
	// 获取矩阵列数
	INT matrix_getcols(matrix_t* pMatrix_t);
	// 获取矩阵数据大小
	INT matrix_get_data_size(matrix_t* pMatrix_t);

private:
	vector<matrix_t*> m_vpMatrix_t;
	static Matrix* m_pInstance;
};

matrix.cpp 具体实现矩阵类
/*******************************
*	file:	matrix.cpp
*	author:	hehl
*	time:	2021/7/9
*******************************/
#include "matrix.h"

Matrix* Matrix::m_pInstance = new Matrix();
Matrix* Matrix::GetInstance()
{
   
   
	if (m_pInstance == nullptr)
	{
   
   
		m_pInstance = new Matrix();
	}
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值