问题描述

最近需要计算一些旋转矩阵,手算太麻烦,于是写了个小软件

参考

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++矩阵计算器相关推荐

  1. 汉高澳大利亚matrix矩阵计算器

    我在梦中的超级计算机超级计算机锯,使用大量阵列的cpu记忆,完成并行计算.一个手机制造商由于使用普通机械提供的服务,往往造成停机.是铁道部列车网络售票的事实. 无法使用云服务.上万台计算机并行处理,因 ...

  2. pb实现简单计算器的思想_【python实用编程之简单矩阵计算器实现】GUI编程

    以下代码是作者闲暇时所作,对GUI界面编程有想法的朋友欢迎与作者交流 以下是一个简单的矩阵计算器实现的代码: #coding=gbk from tkinter import Tk,Menu,messa ...

  3. Python列表实现矩阵的创建、输入输出、转化转置、加减乘运算并设计一个矩阵计算器GUI界面

    背景:在解决一些编程问题中如棋盘的初始化,链表,队列的构建:数据处理中如用SAS软件输入数据等涉及到矩阵的概念,而用编程语言实现矩阵的方式有C中的数组,python中的列表等.现在给你一个数据如下,或 ...

  4. 基于numpy实现矩阵计算器

    要求 制作一个Python的矩阵计算器: ① 程序提供任意两矩阵的加.乘法运算:方阵的行列式计算.逆矩阵计算.特征分解:任意矩阵的转置等计算功能,可自行添加功能 ② 从控制台通过键盘获取数据并完成以上 ...

  5. PyQt5 实现矩阵计算器

    为什么要实现矩阵计算器? 答:因为可以带来便利,相当于把matlib中对矩阵的基本操作抽离出来,降低操作门槛,同时也更加灵活自由,代码可以自己控制,功能可以自己添加修改. –参考了pyqt5的exam ...

  6. 矩阵计算器的c语言代码大全,用C语言实现矩阵计算器

    代码: //矩阵计算器 #include void getmatrix(int m, int n, double m1[][n], double m2[][m]); void calculate(in ...

  7. java联盟计算器6_GitHub - java-b/Lab-6: 矩阵计算器

    Lab-6 本节目标: 实现一个模拟 MATLAB 的矩阵计算器,可以进行矩阵的点乘和相加 矩阵计算器(Tiny Matlab) Matlab 是一个著名的数学运算工具包,在各行各业有广泛的应用.我校 ...

  8. C++实现矩阵计算器

    最近又有小伙伴找我写用C++实现一个矩阵计算器,功能如下:矩阵相加,矩阵相减,矩阵转置,矩阵相乘,行列式,和上三角,矩阵的逆. 话不多说看下文: class Matrix {private:int r ...

  9. 矩阵化为行最简形矩阵计算器_[内附完整源码和文档] 基于C++的小型特殊计算器...

    1.设计内容 实现一个特殊的计算器,可以实现复数.有理数.矩阵和集合的特殊计算.程序可以实现复数.有理数的加.减.乘.除,可以实现矩阵的加法.减法和乘法运算,也可以实现集合的求交集.并集.子集的运算. ...

  10. 用C++实现矩阵计算器

    Data.h #include"Function.h" //矩阵的数据结构载体 struct Matrix {int m;int n;//double**指针,为其在堆区开辟内存, ...

最新文章

  1. 爬虫图片href是html图片,python爬虫取图片详解,
  2. jsp中类似gridview的功能
  3. 开发留言本,学习笔记
  4. visio篇章--1
  5. VC++和VC++.NET中与图像处理有关的几个概念、结构和类
  6. Mac OS X 10.7.2 Lion下快速锁定屏幕
  7. LINQ to Entities 比较日期
  8. element tree不刷新视图_架构蓝图软件架构 quot;4+1quot; 视图模型
  9. 谷歌离线地图WMS/WMTS服务
  10. python合并两个txt列_python如何将两个txt文件内容合并
  11. Win10不能禁和不建议禁的服务以及禁用后的影响
  12. 由祖冲之圆周率洞悉——古中国数学家的计算力真是惊人
  13. HTML5期末大作业:手表商城网站设计——手表商城网站模板源码(17页) web期末作业设计网页_手表商城网页设计作业成品
  14. mysql定期清理会话_MySQL会话闲置时间控制
  15. 魏则西事件与百度医疗竞价排名引发的伦理与道德问题
  16. 前端HTML中的怪异盒模型
  17. xxl-job任务调度中心
  18. ubuntu18.04 aria2 GUI 的安装使用
  19. sumo之定义车辆和路由
  20. Error @vitejsplugin-vue requires vue (>=3.2.13) or @vuecompiler-sfc to be present in the dependen

热门文章

  1. 【燕秀工具箱】模具辅助下载安装使用手册
  2. Android简易本地音乐播放器,Android简易音乐播放器实现代码
  3. 微服务网关Spring Cloud Gateway
  4. R语言大数据分析之新闻文本数据分析
  5. wps桌面右键缺少新建文档入口
  6. 花两个月吃透京东T8推荐的178页京东基础架构建设之路,入职定T5
  7. LeetCode——75. 颜色分类(面试题)
  8. Altium Designer入门教程:软件安装、中文设置与原件库配置
  9. C语言全局变量与局部变量
  10. linux在当前目录 查找abc文件夹,《find技巧》-“linux命令五分系列”之一