C/C++矩阵计算器
问题描述
最近需要计算一些旋转矩阵,手算太麻烦,于是写了个小软件
参考
C/C++实现矩阵各种运算
Adjoint and Inverse of a Matrix
实现
Vecace博主的C/C++实现矩阵各种运算已经实现了诸如“加、减、乘、数乘”等大部分功能,在此基础上增加求矩阵的逆
的功能,具体如下:
#include <iostream>
#include <malloc.h>
#include <stdio.h>
using namespace std;typedef struct
{//结构体int row, col;//二维指针,目的是动态分配内存float** matrix;
} Matrix;typedef struct
{char* name;char* number;
} Student;Matrix CreateMatrix()
{Matrix m;int row, col;cout << "输入行数与列数:" << endl;cin >> row >> col;float** enterMatrix;enterMatrix = (float**)malloc(row * sizeof(float*));for (int i = 0; i < row; i++)enterMatrix[i] = (float*)malloc(col * sizeof(float));cout << "输入你的矩阵:" << endl;for (int i = 0; i < row; i++){for (int j = 0; j < col; j++){cin >> enterMatrix[i][j];}}m.col = col;m.row = row;m.matrix = enterMatrix;return m;
}Matrix Create2DArrayDefault(int row_col)
{Matrix m;float** enterMatrix;enterMatrix = (float**)malloc(row_col * sizeof(float*));for (int i = 0; i < row_col; i++)enterMatrix[i] = (float*)malloc(row_col * sizeof(float));for (int i = 0; i < row_col; i++){for (int j = 0; j < row_col; j++){enterMatrix[i][j] = 0;}}m.col = row_col;m.row = row_col;m.matrix = enterMatrix;return m;
}// Function to get cofactor of A[p][q] in temp[][]. n is current
// dimension of A[][]
void getCofactor(Matrix A, Matrix temp, int p, int q, int n)
{int i = 0, j = 0;// Looping for each element of the matrix for (int row = 0; row < n; row++){for (int col = 0; col < n; col++){// Copying into temporary matrix only those element // which are not in given row and column if (row != p && col != q){temp.matrix[i][j++] = A.matrix[row][col];// Row is filled, so increase row index and // reset col index if (j == n - 1){j = 0;i++;}}}}
}/* Recursive function for finding determinant of matrix.n is current dimension of A[][]. */
int determinant(Matrix A, int n)
{int D = 0; // Initialize result // Base case : if matrix contains single element if (n == 1)return A.matrix[0][0];Matrix temp = Create2DArrayDefault(n); // To store cofactors int sign = 1; // To store sign multiplier // Iterate for each element of first row for (int f = 0; f < n; f++){// Getting Cofactor of A[0][f] getCofactor(A, temp, 0, f, n);D += sign * A.matrix[0][f] * determinant(temp, n - 1);// terms are to be added with alternate sign sign = -sign;}return D;
}// Function to get adjoint of A[N][N] in agetCofactordj[N][N].
void adjoint(Matrix A, Matrix adj)
{if (A.row == 1){adj.matrix[0][0] = 1;adj.row = 1;adj.col = 1;return;}int N = A.row;// temp is used to store cofactors of A[][] int sign = 1;Matrix temp = Create2DArrayDefault(N);for (int i = 0; i < N; i++){for (int j = 0; j < N; j++){// Get cofactor of A[i][j] getCofactor(A, temp, i, j, N);// sign of adj[j][i] positive if sum of row // and column indexes is even. sign = ((i + j) % 2 == 0) ? 1 : -1;// Interchanging rows and columns to get the // transpose of the cofactor matrix adj.matrix[j][i] = (sign) * (determinant(temp, N - 1));}}adj.row = N;adj.col = N;
}bool inverse(Matrix A, Matrix inverse)
{// Find determinant of A[][] int N = A.row;int det = determinant(A, A.row);if (det == 0){cout << "矩阵的逆不存在!"/*"Singular matrix, can't find its inverse"*/;return false;}// Find adjoint Matrix adj = Create2DArrayDefault(N);adjoint(A, adj);// Find Inverse using formula "inverse(A) = adj(A)/det(A)" for (int i = 0; i < N; i++)for (int j = 0; j < N; j++)inverse.matrix[i][j] = adj.matrix[i][j] / float(det);inverse.row = N;inverse.col = N;return true;
}//初始化一个行为row列为col矩阵
Matrix InitMatrix(int row, int col)
{Matrix m;float** matrix;matrix = (float**)malloc(row * sizeof(float*));for (int i = 0; i < row; i++)matrix[i] = (float*)malloc(col * sizeof(float));for (int i = 0; i < row; i++){for (int j = 0; j < col; j++){matrix[i][j] = 0;}}m.col = col;m.row = row;m.matrix = matrix;return m;
}Matrix add(Matrix m1, Matrix m2)
{for (int i = 0; i < m1.row; i++){for (int j = 0; j < m1.col; j++){m1.matrix[i][j] = m1.matrix[i][j] + m2.matrix[i][j];}}return m1;
}Matrix sub(Matrix m1, Matrix m2)
{for (int i = 0; i < m1.row; i++){for (int j = 0; j < m1.col; j++){m1.matrix[i][j] = m1.matrix[i][j] - m2.matrix[i][j];}}return m1;
}float calRowCol(Matrix M1, Matrix M2, int row, int col)//row为M1的行 col为m2的列
{float result = 0;int same = M1.col;for (int j = 0; j < same; j++){result += M1.matrix[row][j] * M2.matrix[j][col];}return result;
}Matrix Mul(Matrix m1, Matrix m2)
{Matrix result = InitMatrix(m1.row, m2.col);for (int i = 0; i < m1.row; i++){for (int j = 0; j < m2.col; j++){result.matrix[i][j] = calRowCol(m1, m2, i, j);}}return result;
}Matrix numMul(Matrix m, int num)
{cout << "数值:" << num << endl;for (int i = 0; i < m.row; i++){for (int j = 0; j < m.col; j++){m.matrix[i][j] = m.matrix[i][j] * num;}}return m;
}void printMatrix(Matrix m)
{for (int i = 0; i < m.row; i++){for (int j = 0; j < m.col; j++){cout << m.matrix[i][j] << " ";}cout << endl;}
}int main()
{int num = 0;do{cout << "*************************************\n";cout << "* 菜单 *\n";cout << "* 1.矩阵相加 *\n";cout << "* 2.矩阵相减 *\n";cout << "* 3.矩阵相乘 *\n";cout << "* 4.矩阵数乘 *\n";cout << "* 5.矩阵的逆 *\n";cout << "* 6.退出 *\n";cout << "*************************************\n";cin >> num;if (1 == num || 2 == num || 3 == num){cout << "请输入矩阵1" << endl;Matrix m1 = CreateMatrix();cout << "请输入矩阵2" << endl;Matrix m2 = CreateMatrix();cout << "两矩阵为" << endl;printMatrix(m1);cout << endl;printMatrix(m2);switch (num){case 1:{if (m1.col != m2.col || m1.row != m2.row){cout << "行列不同" << endl;}else {cout << "结果为:" << endl;printMatrix(add(m1, m2));}break;}case 2:{if (m1.col != m2.col || m1.row != m2.row){cout << "参数错误" << endl;}else {cout << "结果为:" << endl;printMatrix(sub(m1, m2));}break;}case 3:{if (m1.col != m2.row){cout << "参数错误" << endl;}else {cout << "结果为:" << endl;printMatrix(Mul(m1, m2));}break;}default:break;}}else if (4 == num){int number = 1;cout << "请输入矩阵" << endl;Matrix m = CreateMatrix();cout << "请输入数值" << endl;cin >> number;cout << "矩阵为:" << endl;printMatrix(m);cout << "数值为:" << endl;cout << number << endl;printMatrix(numMul(m, number));}else if (5 == num){cout << "请输入矩阵" << endl;Matrix m1 = CreateMatrix();cout << "输入矩阵为" << endl;printMatrix(m1);cout << endl;Matrix m2 = Create2DArrayDefault(m1.row);inverse(m1, m2);printMatrix(m2);}cout << "按回车继续....";getchar();getchar();system("cls");} while (1 == num || 2 == num || 3 == num || 4 == num || 5 == num);return 0;
}
总结
有很多细节可以优化,不过作为小工具够用:)
C/C++矩阵计算器相关推荐
- 汉高澳大利亚matrix矩阵计算器
我在梦中的超级计算机超级计算机锯,使用大量阵列的cpu记忆,完成并行计算.一个手机制造商由于使用普通机械提供的服务,往往造成停机.是铁道部列车网络售票的事实. 无法使用云服务.上万台计算机并行处理,因 ...
- pb实现简单计算器的思想_【python实用编程之简单矩阵计算器实现】GUI编程
以下代码是作者闲暇时所作,对GUI界面编程有想法的朋友欢迎与作者交流 以下是一个简单的矩阵计算器实现的代码: #coding=gbk from tkinter import Tk,Menu,messa ...
- Python列表实现矩阵的创建、输入输出、转化转置、加减乘运算并设计一个矩阵计算器GUI界面
背景:在解决一些编程问题中如棋盘的初始化,链表,队列的构建:数据处理中如用SAS软件输入数据等涉及到矩阵的概念,而用编程语言实现矩阵的方式有C中的数组,python中的列表等.现在给你一个数据如下,或 ...
- 基于numpy实现矩阵计算器
要求 制作一个Python的矩阵计算器: ① 程序提供任意两矩阵的加.乘法运算:方阵的行列式计算.逆矩阵计算.特征分解:任意矩阵的转置等计算功能,可自行添加功能 ② 从控制台通过键盘获取数据并完成以上 ...
- PyQt5 实现矩阵计算器
为什么要实现矩阵计算器? 答:因为可以带来便利,相当于把matlib中对矩阵的基本操作抽离出来,降低操作门槛,同时也更加灵活自由,代码可以自己控制,功能可以自己添加修改. –参考了pyqt5的exam ...
- 矩阵计算器的c语言代码大全,用C语言实现矩阵计算器
代码: //矩阵计算器 #include void getmatrix(int m, int n, double m1[][n], double m2[][m]); void calculate(in ...
- java联盟计算器6_GitHub - java-b/Lab-6: 矩阵计算器
Lab-6 本节目标: 实现一个模拟 MATLAB 的矩阵计算器,可以进行矩阵的点乘和相加 矩阵计算器(Tiny Matlab) Matlab 是一个著名的数学运算工具包,在各行各业有广泛的应用.我校 ...
- C++实现矩阵计算器
最近又有小伙伴找我写用C++实现一个矩阵计算器,功能如下:矩阵相加,矩阵相减,矩阵转置,矩阵相乘,行列式,和上三角,矩阵的逆. 话不多说看下文: class Matrix {private:int r ...
- 矩阵化为行最简形矩阵计算器_[内附完整源码和文档] 基于C++的小型特殊计算器...
1.设计内容 实现一个特殊的计算器,可以实现复数.有理数.矩阵和集合的特殊计算.程序可以实现复数.有理数的加.减.乘.除,可以实现矩阵的加法.减法和乘法运算,也可以实现集合的求交集.并集.子集的运算. ...
- 用C++实现矩阵计算器
Data.h #include"Function.h" //矩阵的数据结构载体 struct Matrix {int m;int n;//double**指针,为其在堆区开辟内存, ...
最新文章
- 爬虫图片href是html图片,python爬虫取图片详解,
- jsp中类似gridview的功能
- 开发留言本,学习笔记
- visio篇章--1
- VC++和VC++.NET中与图像处理有关的几个概念、结构和类
- Mac OS X 10.7.2 Lion下快速锁定屏幕
- LINQ to Entities 比较日期
- element tree不刷新视图_架构蓝图软件架构 quot;4+1quot; 视图模型
- 谷歌离线地图WMS/WMTS服务
- python合并两个txt列_python如何将两个txt文件内容合并
- Win10不能禁和不建议禁的服务以及禁用后的影响
- 由祖冲之圆周率洞悉——古中国数学家的计算力真是惊人
- HTML5期末大作业:手表商城网站设计——手表商城网站模板源码(17页) web期末作业设计网页_手表商城网页设计作业成品
- mysql定期清理会话_MySQL会话闲置时间控制
- 魏则西事件与百度医疗竞价排名引发的伦理与道德问题
- 前端HTML中的怪异盒模型
- xxl-job任务调度中心
- ubuntu18.04 aria2 GUI 的安装使用
- sumo之定义车辆和路由
- Error @vitejsplugin-vue requires vue (>=3.2.13) or @vuecompiler-sfc to be present in the dependen
热门文章
- 【燕秀工具箱】模具辅助下载安装使用手册
- Android简易本地音乐播放器,Android简易音乐播放器实现代码
- 微服务网关Spring Cloud Gateway
- R语言大数据分析之新闻文本数据分析
- wps桌面右键缺少新建文档入口
- 花两个月吃透京东T8推荐的178页京东基础架构建设之路,入职定T5
- LeetCode——75. 颜色分类(面试题)
- Altium Designer入门教程:软件安装、中文设置与原件库配置
- C语言全局变量与局部变量
- linux在当前目录 查找abc文件夹,《find技巧》-“linux命令五分系列”之一