FreeMatrix-C: 完整、安全的C/C++矩阵数学运算库开源库

news/2024/12/12 11:25:26/

FreeMatrix-C: An open source C/C++ matrix and vector library for safe computations(support version C99+)

项目中需要将matlab代码转为支持MVS2010运行的C++代码,鉴于中文互联网上的C/C++矩阵运算资料在完整度、版本兼容性、可读性、安全性等方面有待进一步提升,故手搓FreeMatrix-C,并在修改后将v1.0版本开源。当前版本仅支持实数运算,缺乏对动态矩阵和自定义数据类型运算的支持、缺乏溢出检测等安全机制、缺乏matlab中支持的矩阵索引语法..后续版本将迭代完善矩阵操作算法,并提高代码的安全性能与跨平台能力。


FreeMatrix-C 是一个简单实现的C语言矩阵运算库,它提供了完整、安全的矩阵操作函数与矩阵算法,包括矩阵生成、基础运算、逆运算、行列式、范数运算、秩、奇异值分解等。


** 该项目的目标是简化C语言环境下的矩阵运算,语法支持早期C语言版本及早期Microsoft Visual Studio 2010编译器环境(_MSC_VER >= 1600),便于科研和教学使用。


** 该项目遵循Apache-3.0许可证,可在GitHub地址:XingGao-cn/FreeMatrix-C(github.com)上找到完整源代码与测试用例。

以下是头文件matrix.h,具体实现可在上述github地址找到完整代码.

目前版本为FreeMatrix-C v1.0(2024-12-9),实现了矩阵运算的基础功能。

在2.0版本,将引入以下改进:

1、增加计算矩阵的特征值、秩等运算操作
2、增加类似matlab的矩阵索引操作
3、提高矩阵运算安全性 防止溢出 防止除数为零。

//matrix.h
#ifndef MATRIX_H
#define MATRIX_H#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 一维指针版// 安全释放内存的宏
#define SAFE_FREE(ptr) do { if (ptr) { free(ptr); ptr = NULL; } } while (0)
// 自定义精度的两数大小比较 用于取代 == 运算符
#define FLOAT_EQUAL(a, b) (fabs((a) - (b)) < 1e-6)// 存放矩阵的数据结构
typedef struct 
{int rows,columns;		//rows为行,columns为列,double *data; //提高索引效率
}Matrix;//矩阵的基本操作
Matrix* initMatrix(int rows,int columns);		//初始化矩阵
void assignMatrix(Matrix *matrix,double *array);				//给一个矩阵赋值
int capacityMatrix(Matrix *matrix);								//获得一个矩阵的容量
void freeMatrix(Matrix *matrix);							//释放一个矩阵
void copyMatrix(Matrix *matrix_A, Matrix *matrix_B);		//复制一个矩阵的值 A to B
Matrix* indexVector(Matrix *vector_A, int left, int right);		//索引向量A[left:right] [left-1, right)
Matrix* indexMatrix(Matrix *matrix_A, int left, int right);		//索引矩阵A[left:right] [left-1, right)
void printMatrix(Matrix *matrix);							//打印一个矩阵//矩阵的基本运算
Matrix* diagMatrix(double* diag_elements, int n);  //创建对角阵
Matrix* addMatrix(Matrix *matrix_A,Matrix *matrix_B);		//矩阵的加法
Matrix* subMatrix(Matrix *matrix_A,Matrix *matrix_B);		//矩阵的减法
Matrix* mulMatrix(Matrix *matrix_A,Matrix *matrix_B);		//矩阵的乘法
Matrix* rightDivMatrix(Matrix *matrix_A,Matrix *matrix_B);		//矩阵的除法 2-3阶矩阵 右除 /:A/B表示矩阵A乘以矩阵B的逆
Matrix* leftDivMatrix(Matrix *matrix_A,Matrix *matrix_B);		//矩阵的除法 2-3阶矩阵 左除 \:A\B表示矩阵A的逆乘以矩阵B
Matrix* rightDivMatrix_n(Matrix *matrix_A,Matrix *matrix_B);		//矩阵的除法 n阶矩阵 右除 /:A/B表示矩阵A乘以矩阵B的逆
Matrix* leftDivMatrix_n(Matrix *matrix_A,Matrix *matrix_B);		//矩阵的除法 n阶矩阵 左除 \:A\B表示矩阵A的逆乘以矩阵BMatrix* dotProductMatrix(Matrix *matrix_A,Matrix *matrix_B); //矩阵的点积
Matrix* crossProduct(Matrix *vector_A, Matrix *vector_B) ;// 向量叉乘函数
Matrix* crossMatrix(Matrix *matrix_A,Matrix *matrix_B); //矩阵的叉乘Matrix* getsubMatrix(Matrix *matrix, int row, int col); // 获取子矩阵(去掉指定行row和列col	)
double detMatrix(Matrix *matrix); //矩阵行列式 n阶void transMatrix(Matrix *matrix);			//转置 条件为方阵
Matrix* transMatrix2(Matrix *matrix);  //转置 非方阵bool isInvertible(Matrix *matrix);// 2-3阶矩阵是否可逆
bool isInvertiblenx_n(Matrix *matrix);// // 判断n阶矩阵是否可逆的函数Matrix* invMatrix(Matrix *matrix); //2-3阶矩阵的逆
Matrix* safeMatrixInv(Matrix *matrix, int n); //n阶安全求逆// 向量范数 rows or columns为1
Matrix* normVector1(Matrix *vector);		//向量的一范数
Matrix* normVector2(Matrix *vector);		//向量的二范数// 初等变换阵 (旋转矩阵 顺时针)
Matrix* rotationMatrix_x (double element);
Matrix* rotationMatrix_y (double element);
Matrix* rotationMatrix_z (double element);#endif // MATRIX_H


http://www.ppmy.cn/news/1554481.html

相关文章

神经网络的起源与工作原理

神经网络起源&#xff1a;一个生物神经网络是由一组化学上相连或功能上相关的神经元组成。一个神经元可能与许多其他神经元相连&#xff0c;网络中的神经元和连接的总数可能很广泛。连接&#xff0c;称为突触&#xff0c;通常是从轴突到树突形成的&#xff0c;尽管树突和其他连…

16、PyTorch中进行卷积残差模块算子融合

文章目录 1. 1x1卷积核-> 3x3卷积核2. 输入x --> 3x3卷积核&#xff0c;无变化3. 代码 1. 1x1卷积核-> 3x3卷积核 假设我们有一个1x1的卷积核&#xff0c;需要通过填充变为一个3x3的卷积核,实现的是像素之间无关联 [ 4 ] → [ 0 0 0 0 4 0 0 0 0 ] \begin{equation}…

Android显示系统(07)- OpenGL ES - 纹理Texture

Android显示系统&#xff08;02&#xff09;- OpenGL ES - 概述 Android显示系统&#xff08;03&#xff09;- OpenGL ES - GLSurfaceView的使用 Android显示系统&#xff08;04&#xff09;- OpenGL ES - Shader绘制三角形 Android显示系统&#xff08;05&#xff09;- OpenGL…

JAVA学习日记(二十五)多线程

一、多线程概念 线程: 线程是操作系统能够进行运算调度的最小单位。它被包含在进程中&#xff0c;是进程中的实际运作单位 &#xff08;应用软件中相互独立&#xff0c;可以同时运行的功能&#xff09; 进程&#xff1a; 进程是程序的基本执行实体 多线程应用场景&#x…

Connection对象,Statement对象和ResultSet对象的依赖关系 JDBC

在JDBC&#xff08;Java Database Connectivity&#xff09;中&#xff0c;Connection、Statement和ResultSet是三个主要的接口&#xff0c;用于与数据库进行交互。当Connection被关闭时&#xff0c;与之关联的Statement和ResultSet对象也会被关闭&#xff0c;这是因为它们之间…

梳理你的思路(从OOP到架构设计)_基本OOP知识03

目录 1、<基类/子类 >结构的接口(卡榫函数) 1&#xff09;卡榫(Hook) 2&#xff09;卡榫函数的Java实现 2、IoC机制与基於 Default 軟硬整合觀點 函数 1&#xff09;卡榫函数实现IoC机制 2&#xff09;默认(Default)行为 1、<基类/子类 >结构的接口(卡榫函数…

容器部署Prometheus+Grafana

一、Grafana介绍 Zabbix 和 Grafana 是两种流行的监控工具,它们在功能和用途上有所不同: Zabbix: Zabbix 是一个开源的监控解决方案,主要用于监控网络服务和应用程序。它包括了自己的数据存储解决方案,可以直接从监控的设备收集数据。Zabbix 提供了广泛的监控功能,包括但…

【离线环境迁移】使用Conda打包和还原Python环境指南

本文介绍了一种利用Conda工具快速打包和迁移Python环境的方法。 通过简单的步骤&#xff0c;轻松实现离线服务器的环境配置&#xff0c;解决网络限制问题。 1.创建环境并安装相关依赖 conda create -n myenv python3.x conda activate myenv conda install <package_list&g…