为C量身定制的Matrix库
Matrix库的诞生让矩阵操作在C中也可以玩的很溜!
项目地址:https://github.com/SJ2050SJ/Matrix
文章目录
Matrix的设计框架
Matrix库中,矩阵的存储结构采用的是链表和数组结合的形式,矩阵的每一行串成一个链表,而每一行的数据则采用的数组进行存储,最终的结果是平均了链表和数组的优缺点。Matrix库中采用的是二维double类型的矩阵(未来可能会根据需求拓展到高维矩阵上去),支持矩阵的加减、乘、转置、换行、数乘、累加、求逆、求行列式、解线性方程组等基本操作,总之,这个库我认为很棒!
Matrix的上手简历
这里将给一段使用Matrix库求解一组线性方程的例子:
#include <stdio.h>
#include <stdlib.h>
#include "matrix.h"
int main()
{
/*求解一下线性方程组:
| 2x1 - x2 - x3 + x4 = 2,
| x1 + x2 - 2x3 + x4 = 4,
< 4x1 - 6x2 + 2x3 - 2x4 = 4,
| 3x1 + 6x2 - 9x3 + 7x4 = 9.*/
double A[4][4] = {
{2,-1,-1,1},
{1,1,-2,1},
{4,-6,2,-2},
{3,6,-9,7}
}; // 系数矩阵A的数据
double b[4][1] = {
{2},
{4},
{4},
{9}
}; // 右边常数项矩阵b的数据
pMatrixRow *matrixRowsOfA, *matrixRowsOfb; // 矩阵的每行
pMatrix matrixA, matrixb, resultx; // A、b矩阵以及结果的x向量
matrixRowsOfA = (pMatrixRow*)malloc(sizeof(pMatrixRow) * 4);
matrixRowsOfb = (pMatrixRow*)malloc(sizeof(pMatrixRow) * 4);
// 矩阵每行初始化
for (int i = 0; i < 4; i++) {
matrixRowsOfA[i] = (pMatrixRow)malloc(sizeof(MatrixRow));
matrixRowsOfA[i]->row = A[i];
matrixRowsOfb[i] = (pMatrixRow)malloc(sizeof(MatrixRow));
matrixRowsOfb[i]->row = b[i];
}
// A,b矩阵初始化
matrixA = MatrixInit(matrixRowsOfA, 4, 4, true);
matrixb = MatrixInit(matrixRowsOfb, 4, 1, true);
// 线性方程组求解
resultx = SolveLinearEquations(matrixA, matrixb);
printf("|2x1 - x2 - x3 + x4 = 2,\n\
| x1 + x2 - 2x3 + x4 = 4,\n\
< 4x1 - 6x2 + 2x3 - 2x4 = 4,\n\
| 3x1 + 6x2 - 9x3 + 7x4 = 9.\n");
printf("上述方程的解为:\n");
// 打印矩阵
MatrixPrint(resultx,6);
// 清理矩阵
MatrixCleanAll();
system("pause");
return 0;
}
上面简短的代码中我们便成功求解了一个线性方程组,这里我们只需搞清楚MatrixRow和Matrix的区别(pMatrixRow和pMatrix是MatrixRow和Matrix的指针形态),前者是指矩阵的一行,后者代表整个矩阵,矩阵的初始化就是把矩阵每一行的MatrixRow传入MatrixInit函数中,其便会返回初始化后的矩阵。
你可能对上面的MatrixCleanAll函数产生好奇,是的,这个库中实现了自动清理机制,调用该函数便会清理所有矩阵,大大降低了内存溢出的可能性。其还有个兄弟函数——MatrixClean,这个函数尽会清理重要级别为false的矩阵,这也就意味着,我们可以使用随用随销的矩阵,而不必为给每个矩阵变量起名字而苦恼。
上述程序的运行动图如下:
最后再来感受一下自动清理机制的魅力:
开启自动清理前

开启自动清理后
为C量身定制的Matrix库的更多相关文章
- NumPy矩阵库
NumPy - 矩阵库 NumPy 包包含一个 Matrix库numpy.matlib.此模块的函数返回矩阵而不是返回ndarray对象. matlib.empty() matlib.empty()函 ...
- 总结使用Unity 3D优化游戏运行性能的经验
原地址:http://www.gameres.com/msg_221889.html 作者:Amir Fasshihi 流畅的游戏玩法来自流畅的帧率,而我们即将推出的动作平台游戏<Shadow ...
- numpy学习笔记(四)
(1)NumPy - 矩阵库 NumPy 包包含一个 Matrix库numpy.matlib.此模块的函数返回矩阵而不是返回ndarray对象. matlib.empty()返回一个新矩阵,而不初始化 ...
- Matlab、R向量与矩阵操作 z
已有 1849 次阅读 2012-8-2 15:15 |系统分类:科研笔记|关键词:矩阵 480 window border center Matlab.R向量与矩阵操作 描 述 Matla ...
- (转)总结使用Unity 3D优化游戏运行性能的经验
http://www.199it.com/archives/147913.html 流畅的游戏玩法来自流畅的帧率,而我们即将推出的动作平台游戏<Shadow Blade>已经将在标准iPh ...
- [转]总结使用Unity 3D优化游戏运行性能的经验
转载自:http://www.gameres.com/msg_221889.html 作者:Amir Fasshihi 流畅的游戏玩法来自流畅的帧率,而我们即将推出的动作平台游戏<Shadow ...
- 实现求解线性方程(矩阵、高斯消去法)------c++程序设计原理与实践(进阶篇)
步骤: 其中A是一个n*n的系数方阵 向量x和b分别是未知数和常量向量: 这个系统可能有0个.1个或者无穷多个解,这取决于系数矩阵A和向量b.求解线性系统的方法有很多,这里使用一种经典的方法——高斯消 ...
- Matlab、R向量与矩阵操作
Matlab.R向量与矩阵操作 描 述 Matlab R 1 建立行向量v=[1 2 3 4] v=[1 2 3 4] v<-c(1,2,3,4)或v<-scan(),然后输入 ...
- 【转载】总结使用Unity3D优化游戏运行性能的经验
流畅的游戏玩法来自流畅的帧率,而我们即将推出的动作平台游戏<Shadow Blade>已经将在标准iPhone和iPad设备上实现每秒60帧视为一个重要目标. 以下是我们在紧凑的优化过程中 ...
随机推荐
- 第二篇 配置wcf
老老实实学WCF 第二篇 配置WCF 在上一篇中,我们在一个控制台应用程序中编写了一个简单的WCF服务并承载了它.先回顾一下服务端的代码: using System; using System.Col ...
- 从基础到实践,一文带你看懂HashMap
摘要:HashMap是一个用于存储Key-Value键值对的集合,它是面试中经常问到的一个知识点. HashMap是面试中经常问到的一个知识点,也是判断一个候选人基础是否扎实的标准之一,因为通过Has ...
- springboot:This application has no explicit mapping for /erro
springboot启动没有报错,但是访问的时候返回如上图的错误.看报错内容感觉是没有这个mapping对应的接口.但是确实写了. 最终发现是因为springboot的启动类放的位置不对.启动类所在的 ...
- (一)jenkins+git+docker
目录 一.发布流程设计 1.工作流程 2.环境规划如下 二.部署Git仓库 1.创建Git用户并设置密码 2.创建仓库 3.免密访问 4.在jenkins那台机上做ssh认证 三.准备Jenkins环 ...
- 中秋礼物!开源即时通信GGTalk安卓版全新源码!
经过连续两个多月的努力(开发.调试.测试.改bug),我们终于赶在中秋国庆之前能把全新的GGTalk Android版本献给大家. 4年之前我们就推出了GGTalk Android的第一个版本,但是功 ...
- Tomcat 8.5中获取客户端真实IP及协议
获取客户端真实IP ServletRequest接口提供了getRemoteAddr方法用于获取客户端IP,但是当客户端通过代理服务器访问后端服务器的时候,服务器调用getRemoteAddr方法会返 ...
- Python-local variable 'raw_password' referenced before assignment
where? 执行Python程序的时候,报这个错 why? 变量作用域问题,在分支中定义的变量,当满足条件的时候则可以正确得到变量,当不满足条件的时候则报这个错 way? 把变量从分支中抽离到分支上 ...
- Python-开发规范-遵循PEP8规范
Python中空白 1. 4个空格表示缩进,用4个空格代替一个TAB 2. 不再逗号.分号.冒号前加空格,应该在其后加空格 3. 关系运行符.数学运算符.逻辑运算符.赋值运算符 前后都加一个空格 4. ...
- matlab中ceil朝正无穷大四舍五入
来源:https://ww2.mathworks.cn/help/matlab/ref/ceil.html?searchHighlight=ceil&s_tid=doc_srchtitle 本 ...
- MATLAB中exist函数的用法
exist:exist主要有两种形式,一个参数和两个参数的,作用都是用于确定某值是否存在:1. b = exist( a) 若 a 存在,则 b = 1: 否则 b = 0:2. b = e ...