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. [补题]求a[i]+a[j]+i-j的最大值,要求i<j

    题目 如题. 例: 输入: 5 11 6 5 18 12 输出: 29 题解 思路: 一直是按着(a[i]+a[j])+(i-j)想后序的思路,不应该限制住自己,应该多考虑拆的方法.正确思路是把a[i ...

  2. Vue axios封装 实现请求响应拦截

    封装 axios.js import axios from 'axios' import { baseURL } from '@/config' class HttpRequest { constru ...

  3. 二、Git安装--Windows

    Git安装配置 在使用Git前我们需要先安装 Git.Git 目前支持 Linux/Unix.Solaris.Mac和 Windows 平台上运行. Git 各平台安装包下载地址为:http://gi ...

  4. 在思科三层交换机上配置DHCP,不同网段/VLAN间互通

    摘要: 描述:在三层交换机上配置DHCP,实现DHCP为PC1/PC3分配192.168.1.X网段:实现DHCP为PC2/PC4分配192.168.2.X网段:并且各个PC间要可以互相通信.(文末附 ...

  5. k8s&docker面试总结

    花了大半个月对k8s&docker进行了梳理,包括之前读过的书,官方文档以及k&d在公司项目的实践等. 以下是个人对docker & k8s 面试知识点的总结: 1 docke ...

  6. J.U.C之Executor框架入门指引

    1.Executor接口 This interface provides a way of decoupling task submission from the mechanics of how e ...

  7. Git【常见知识点速查】

    文章更新时间:2020/06/17 一.基础知识点解析 Git工作流程 以上包括一些简单而常用的命令,但是先不关心这些,先来了解下面这4个专有名词. Workspace:工作区 Index / Sta ...

  8. linux与linux间,互相拷贝文件

    直接使用scp命令 和远程Linux主机 进行文件的拷贝    1.可以将远程Linux系统上的文件拷贝到本地计算机    2.也可以将本地计算机上的文件拷贝到远程Linux系统上. 比如:我们要拷贝 ...

  9. 创建Vue项目及封装axios

    1. 始vue化项目 https://www.cnblogs.com/xiaonq/p/11027880.html vue init webpack deaxios # 使用脚手架创建项目 deaxi ...

  10. java安全编码指南之:死锁dead lock

    目录 简介 不同的加锁顺序 使用private类变量 使用相同的Order 释放掉已占有的锁 简介 java中为了保证共享数据的安全性,我们引入了锁的机制.有了锁就有可能产生死锁. 死锁的原因就是多个 ...