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