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库的更多相关文章

  1. NumPy矩阵库

    NumPy - 矩阵库 NumPy 包包含一个 Matrix库numpy.matlib.此模块的函数返回矩阵而不是返回ndarray对象. matlib.empty() matlib.empty()函 ...

  2. 总结使用Unity 3D优化游戏运行性能的经验

    原地址:http://www.gameres.com/msg_221889.html 作者:Amir Fasshihi 流畅的游戏玩法来自流畅的帧率,而我们即将推出的动作平台游戏<Shadow ...

  3. numpy学习笔记(四)

    (1)NumPy - 矩阵库 NumPy 包包含一个 Matrix库numpy.matlib.此模块的函数返回矩阵而不是返回ndarray对象. matlib.empty()返回一个新矩阵,而不初始化 ...

  4. Matlab、R向量与矩阵操作 z

    已有 1849 次阅读 2012-8-2 15:15 |系统分类:科研笔记|关键词:矩阵 480 window border center Matlab.R向量与矩阵操作   描    述 Matla ...

  5. (转)总结使用Unity 3D优化游戏运行性能的经验

    http://www.199it.com/archives/147913.html 流畅的游戏玩法来自流畅的帧率,而我们即将推出的动作平台游戏<Shadow Blade>已经将在标准iPh ...

  6. [转]总结使用Unity 3D优化游戏运行性能的经验

    转载自:http://www.gameres.com/msg_221889.html 作者:Amir Fasshihi 流畅的游戏玩法来自流畅的帧率,而我们即将推出的动作平台游戏<Shadow ...

  7. 实现求解线性方程(矩阵、高斯消去法)------c++程序设计原理与实践(进阶篇)

    步骤: 其中A是一个n*n的系数方阵 向量x和b分别是未知数和常量向量: 这个系统可能有0个.1个或者无穷多个解,这取决于系数矩阵A和向量b.求解线性系统的方法有很多,这里使用一种经典的方法——高斯消 ...

  8. 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(),然后输入 ...

  9. 【转载】总结使用Unity3D优化游戏运行性能的经验

    流畅的游戏玩法来自流畅的帧率,而我们即将推出的动作平台游戏<Shadow Blade>已经将在标准iPhone和iPad设备上实现每秒60帧视为一个重要目标. 以下是我们在紧凑的优化过程中 ...

随机推荐

  1. [程序员代码面试指南]第9章-在两个长度相等的排序数组中找到第k小的数(二分)

    题目 给定两个有序数组arr1和arr2,再给定一个整数k,返回所有的数中第k小的数. 题解 利用题目"在两个长度相等的排序数组中找到第上中位数"的函数 分类讨论 k < 1 ...

  2. 云计算openstack——云计算、大数据、人工智能(16)

    一.互联网行业及云计算 在互联网时代,技术是推动社会发展的驱动,云计算则是一个包罗万象的技术栈集合,通过网络提供IAAS.PAAS.SAAS等资源,涵盖从数据中心底层的硬件设置到最上层客户的应用.给我 ...

  3. hystrix源码小贴士之中断

    execution.isolation.thread.interruptOnCancel可以设置当cancellation发生时是否需要中断.通过Future的cancel方法和线程的中断方法来实现是 ...

  4. 疑难杂症 | Excel VBA锁定指定单元格区域

    背景:锁定EXCEL表头 一.手动操作流程 其基本逻辑并不赋值,手动操作流程是: 1.取消所有单元格的"锁定"格式 CTRL+A,选中全部的单元格→单击右键→设置单元格格式→保护→ ...

  5. php第一天-分支结构,循环结构,特殊的流程控制语句

    1.单向条件分支结构 <?php if(true) { echo "yes"; } ?> 2.双向条件分支结构 <?php $a = 10; if($a < ...

  6. 01 android ndk入门实例之android.mk编译

    前言 1 环境 android studio2.3 , window系统 2 ndk https://dl.google.com/android/repository/android-ndk-r16- ...

  7. Java JVM参数在idea里面配置

    找到你需要配置的启动类选择 接着点击Edit Configurations 在VM options里面配置就完成了

  8. 浅谈SSRF

    前言 最近主要是在思考考研的事.还是没想好-- 这几天的话写了一篇简单代审投稿了星盟,看了会SSRF.今天简单写下SSRF. 本文所有思路均来自互联网,并没有新想法.仅仅只是做个记录. 本文可能会有大 ...

  9. hexo博客添加gitalk评论系统

      经过了一天的折腾,我终于为自己的博客添加上了评论系统.坦率的讲,为什么网上那么多方案我还要自己写一篇博客,那就是因为他们说的都有bug,所以我要自己总结一下.   我选用的是gitalk评论系统, ...

  10. Linux Wait Queue 等待队列

    一.引言 linux 内核的等待队列和进程调度息息相关,进程在某些情况下必须等待某些事件的发生,例如:等待一个磁盘操作的终止,等待释放系统资源,或等待指定的时间间隔. 等待队列实现了在事件上的条件等待 ...