一、知识储备

矩阵与矩阵之间可以进行加法、减法和乘法运算(矩阵的“除法”,被特别地定义出了逆矩阵,通过一个矩阵与另一个的逆矩阵的乘法来实现),矩阵和数之间可以进行数乘运算;

• 矩阵的加法和减法一致,均需要满足参加运算的矩阵具有相同的行列规模,矩阵加减法运算规则如下:如果有矩阵

,矩阵
,则

• 矩阵的乘法比较特殊:对于

列的矩阵
列的矩阵
做乘法,需要满足
的列规模等同
的行规摸,即

乘法运算结果满足:

其中

.

• 矩阵的数乘较为简单:矩阵数乘结果满足

.

二、基本思路

为了方便输入多个矩阵并进行多次计算,我们用 struct 结构体来储存矩阵;用户则通过选择矩阵在组中的下标选出要参加运算的矩阵;

定义三个函数分别实现乘法、加(减)法运算和数乘运算;

在进行运算之前,需要根据输入矩阵的行列规模判断矩阵之间是否可做加减法或乘法;

为了方便调用计算结果,把运算结果也存入结构体中,下标顺延.

三、实现方法

在定义主函数之前,我们构建一个结构体,储存矩阵以及矩阵的行列规模:

struct matrix_group
{float matrix[20][20];int rows;int columns;
} group[100];

定义三个函数分别进行矩阵的乘法、加(减)法和数乘运算:

void do_matrix_multiplication(void);
void do_matrix_addition(int sign);
void do_scalar_multiplication(void);

由于加法运算函数要实现加减两种运算的功能,因此我们向加法运算函数中传入符号 sign ,加法为1,减法为 -1.

为了实现储存计算结果并顺延下标,定义全局变量:

int numbers = 0;

每当 group 中新增一个矩阵,numbers 自增加 1;

为了方便用户做出选择,定义一个用于输出菜单的函数:

void menu(void)
{printf("n");printf("[1]矩阵乘法.n");printf("[2]矩阵加法.n");printf("[3]矩阵减法.n");printf("[4]矩阵数乘.n");printf("[9]输入矩阵.n");printf("[0]退出.n");printf("你的选择是:");
}

在主函数中接受用户输入的选择,并调用相应的函数输出结果;

• 定义主函数:begin 部分用于实现回溯,并输入用户指定个数的矩阵;menu 部分通过调用menu 函数向用户显示菜单,并接受用户指令进行相应的操作:

int main()
{int n,i,j,k,choice = -1;
begin:printf("输入的矩阵个数为:");scanf("%d",&n);for(k = numbers;k < numbers + n;k ++){printf("矩阵 %d 的行规模和列规模是(中间以空格分隔):",k + 1);scanf("%d %d",&group[k].rows,&group[k].columns);for(i = 0;i < group[k].rows;i ++)for(j = 0;j < group[k].columns;j ++)scanf("%f",&group[k].matrix[i][j]);}numbers += n;
menu:menu();scanf("%d",&choice);if(choice == 0)goto end;else if(choice == 9)goto begin;else{if(choice == 1)do_matrix_multiplication();else if(choice == 2)do_matrix_addition(1);else if(choice == 3)do_matrix_addition(-1);else if(choice == 4)do_scalar_multiplication();elseprintf("指令不正确,重新输入!n");goto menu;}
end:return 0;
}

接下来完善三个用以计算并输出结果的函数,这三个函数均需要完成“计算结果 → 输出结果 → 将结果储存为新的矩阵”这三个步骤:

· 首先是矩阵乘法运算函数. 在函数开头,需要确保矩阵可以做乘法,因此引入判断;如果判断可做乘法,利用数学关系

,逐个地输出乘法结果的第
行、第
列的元素并同时保存在 group 中一个新的矩阵中,最后,赋予新矩阵的行规模与列规模:
void do_matrix_multiplication(void)
{int p,q,i,j,k;printf("选择两个矩阵,输入它们的下标,中间以空格分隔:");scanf("%d %d",&p,&q);if(group[p - 1].columns != group[q - 1].rows)printf("矩阵乘法不可做!n");else{for(i = 0;i < group[p - 1].rows;i ++){for(j = 0;j < group[q - 1].columns;j ++){for(k = 0;k < group[p - 1].columns;k ++)group[numbers].matrix[i][j] += group[p - 1].matrix[i][k] * group[q - 1].matrix[k][j];printf("%.3ft",group[numbers].matrix[i][j]);}printf("n");}group[numbers].rows = group[p - 1].rows;group[numbers].columns = group[q - 1].columns;printf("运算结果已经被储存为 矩阵 %dn",++numbers);}
}

· 接着是矩阵加法运算函数. 同样需要先判断是否可做加减;如果加减法可做,则根据主函数中传入的 sign 符号确定是做加法还是做减法;输出并储存矩阵的过程同上:

void do_matrix_addition(int sign)
{int i,j,p,q;printf("选择两个矩阵,输入它们的下标,中间以空格分隔:");scanf("%d %d",&p,&q);if((group[p - 1].rows != group[q - 1].rows) != (group[p - 1].columns != group[q - 1].columns))printf("矩阵加减法不可做!n");else{for(i = 0;i < group[p - 1].rows;i ++){for(j = 0;j < group[q - 1].columns;j ++){printf("%.3ft",group[p - 1].matrix[i][j] + sign * group[q - 1].matrix[i][j]);group[numbers].matrix[i][j] = group[p - 1].matrix[i][j] + sign * group[q - 1].matrix[i][j];}printf("n");}group[numbers].rows = group[p - 1].rows;group[numbers].columns = group[q - 1].columns;printf("运算结果已经被储存为 矩阵 %dn",++numbers);}
}

· 最后是矩阵数乘运算函数. 这个过程比较简单,不需要判断条件直接进行运算即可:

void do_scalar_multiplication(void)
{int i,j,p;float num;printf("选择一个矩阵,输入它的下标:");scanf("%d",&p);printf("输入一个用以数乘的数字:");scanf("%f",&num);for(i = 0;i < group[p - 1].rows;i ++){for(j = 0;j < group[p - 1].columns;j ++){printf("%.3ft",num * group[p - 1].matrix[i][j]);group[numbers].matrix[i][j] = num * group[p - 1].matrix[i][j];}printf("n");}group[numbers].rows = group[p - 1].rows;group[numbers].columns = group[p - 1].columns;printf("运算结果已经被储存为 矩阵 %dn",++numbers);
}

到此为止,此程序就能够实现矩阵的加法、减法、乘法和数乘运算,并将计算结果保留下来.

对全过程进行组合、适当简化,有以下全部过程的代码:

#include <stdio.h>void do_matrix_multiplication(void);
void do_matrix_addition(int sign);
void do_scalar_multiplication(void);
void menu(void);struct matrix_group
{float matrix[20][20];int rows;int columns;
} group[100];int numbers = 0;int main()
{int n,i,j,k,choice = -1;
begin:printf("输入的矩阵个数为:");scanf("%d",&n);for(k = numbers;k < numbers + n;k ++){printf("矩阵 %d 的行规模和列规模是(中间以空格分隔):",k + 1);scanf("%d %d",&group[k].rows,&group[k].columns);printf("请输入一个%d行%d列的矩阵:n",group[k].rows,group[k].columns);for(i = 0;i < group[k].rows;i ++)for(j = 0;j < group[k].columns;j ++)scanf("%f",&group[k].matrix[i][j]);}numbers += n;
menu:menu();scanf("%d",&choice);if(choice == 0)goto end;else if(choice == 9)goto begin;else{if(choice == 1)do_matrix_multiplication();else if(choice == 2)do_matrix_addition(1);else if(choice == 3)do_matrix_addition(-1);else if(choice == 4)do_scalar_multiplication();elseprintf("指令不正确,重新输入!n");goto menu;}
end:return 0;
}void do_matrix_multiplication(void)
{int p,q,i,j,k;printf("选择两个矩阵,输入它们的下标,中间以空格分隔:");scanf("%d %d",&p,&q);if(group[p - 1].columns != group[q - 1].rows)printf("矩阵乘法不可做!n");else{for(i = 0;i < group[p - 1].rows;i ++){for(j = 0;j < group[q - 1].columns;j ++){for(k = 0;k < group[p - 1].columns;k ++)group[numbers].matrix[i][j] += group[p - 1].matrix[i][k] * group[q - 1].matrix[k][j];printf("%.3ft",group[numbers].matrix[i][j]);}printf("n");}group[numbers].rows = group[p - 1].rows;group[numbers].columns = group[q - 1].columns;printf("运算结果已经被储存为 矩阵 %dn",++numbers);}
}void do_matrix_addition(int sign)
{int i,j,p,q;printf("选择两个矩阵,输入它们的下标,中间以空格分隔:");scanf("%d %d",&p,&q);if((group[p - 1].rows != group[q - 1].rows) != (group[p - 1].columns != group[q - 1].columns))printf("矩阵加减法不可做!n");else{for(i = 0;i < group[p - 1].rows;i ++){for(j = 0;j < group[q - 1].columns;j ++){printf("%.3ft",group[p - 1].matrix[i][j] + sign * group[q - 1].matrix[i][j]);group[numbers].matrix[i][j] = group[p - 1].matrix[i][j] + sign * group[q - 1].matrix[i][j];}printf("n");}group[numbers].rows = group[p - 1].rows;group[numbers].columns = group[q - 1].columns;printf("运算结果已经被储存为 矩阵 %dn",++numbers);}
}void do_scalar_multiplication(void)
{int i,j,p;float num;printf("选择一个矩阵,输入它的下标:");scanf("%d",&p);printf("输入一个用以数乘的数字:");scanf("%f",&num);for(i = 0;i < group[p - 1].rows;i ++){for(j = 0;j < group[p - 1].columns;j ++){printf("%.3ft",num * group[p - 1].matrix[i][j]);group[numbers].matrix[i][j] = num * group[p - 1].matrix[i][j];}printf("n");}group[numbers].rows = group[p - 1].rows;group[numbers].columns = group[p - 1].columns;printf("运算结果已经被储存为 矩阵 %dn",++numbers);
}void menu(void)
{printf("n");printf("[1]矩阵乘法.n");printf("[2]矩阵加法.n");printf("[3]矩阵减法.n");printf("[4]矩阵数乘.n");printf("[9]输入矩阵.n");printf("[0]退出.n");printf("你的选择是:");
}

大功告成!

我们以二阶方阵

和二阶方阵
为测试样例测试程序:
输入两个矩阵
矩阵乘法
矩阵加法
矩阵减法
矩阵数乘

以上实现方法并非最简,仅由此文分享个人想法,如有错误,还请各位在评论区指正!

三元组法矩阵加法java_C语言实现矩阵加法、减法、乘法和数乘运算相关推荐

  1. 浮点加法、减法, 乘法、除法运算

    浮点加法.减法运算 1.运算步骤 假设浮点数的阶码和尾数均用补码表示,在浮点加减运算时,为便于浮点数尾数的规格化处理和浮点数的溢出判断,阶码和尾数均采用双符号位表示. ①对阶,小阶向大阶对齐 两个浮点 ...

  2. 老活新整——矩阵转置(C语言版矩阵转置)

    #include <stdio.h> void reverse(int a[][4]); int main() {int a[3][4] = { {1,2,3,4},{5,6,7,8},{ ...

  3. c语言怎么进行大整数加法,c语言 大整数加法

    2013-12-07 回答 以前我也做过一个大整数程序,2000!,不过那里面没有减法.做这个减法真让花时间啊. #include #include #include #define max 4000 ...

  4. 三元组法矩阵加法java_计算机视觉学习笔记(2.1)-KNN算法中距离矩阵的计算

    本笔记系列以斯坦福大学CS231N课程为大纲,海豚浏览器每周组织一次授课和习题答疑.具体时间地点请见微信公众号黑斑马团队(zero_zebra)和QQ群(142961883)发布.同时课程通过腾讯课堂 ...

  5. C语言求矩阵的逆(高斯法)

    初等变换法是常用的矩阵求逆方法之一 相对于伴随法,初等行变换法有着较低的时间复杂度,可以进行相对高维的矩阵运算,但同时也会损失一点点精度. 伴随法可参考之前的博客:C语言求矩阵的逆(伴随法) 目录 数 ...

  6. 7-226 sdut-C语言实验-矩阵输出(数组移位)7-227 sdut- C语言实验-计算1到n的和(循环结构)7-228 加法口诀表

    目录 7-226 sdut-C语言实验-矩阵输出(数组移位) 7-227 sdut- C语言实验-计算1到n的和(循环结构) 7-228 加法口诀表 7-226 sdut-C语言实验-矩阵输出(数组移 ...

  7. 数组:矩阵快速转置 矩阵相加 三元组顺序表/三元矩阵 随机生成稀疏矩阵 压缩矩阵【C语言,数据结构】(内含源代码)

    目录 题目: 题目分析: 概要设计: 二维矩阵数据结构: 三元数组\三元顺序表顺序表结构: 详细设计: 三元矩阵相加: 三元矩阵快速转置: 调试分析: 用户手册: 测试结果: 源代码: 主程序: 头文 ...

  8. 独立按键和矩阵按键c语言,第八章 独立按键和矩阵按键

    我们和单片机之间进行信息交互,主要包含两大类,输入设备和输出设备.前边讲的LED小灯.数码管.点阵都是输出设备,这节课我们学习一下最常用的输入设备--按键.在本节课的学习过程中我们还会穿插介绍一点硬件 ...

  9. 笔记—R语言做矩阵散点图

    笔记-R语言做矩阵散点图 #install.packages("corrgram") #install.packages("GGally") install.p ...

最新文章

  1. Jquery各版本下载
  2. 暗备用的运行状态_备用发电机管理制度
  3. 干货 | DevSecOps在携程的最佳实践
  4. 登陆工行网上银行报60058017错误及输入正确网银密码提示密码不正确
  5. 第7章:图像的平滑处理
  6. OSPF单域实验报告
  7. ResultSetMetaData和ResultSet
  8. html微软雅黑字体模糊,WinXP中微软雅黑字体模糊看得很吃力怎么解决
  9. 全新版本的Tidy Up 5 Mac最新版!重复文件查找和磁盘清理工具
  10. xuperchain 事件订阅 判断交易是否上链 交易状态
  11. web漏洞扫描器原理_面向WEB的分布式漏洞扫描器的设计与实践
  12. 高等数学与计算机的关联论文,高等数学改革管理计算机信息论文
  13. GUI-Guider中文手册
  14. 几个不错的VC编程学习网站
  15. 读书笔记 -公司改造 和 紧迫感
  16. 导致谷歌账号停用的原因
  17. 如何理解statsmodels.ols的输出结果?ols计算的线性回归结果以及手动计算的结果的对比
  18. 条码标签设计软件Nicelabel使用方法
  19. 解决:控制台使用nvm控制node版本时出现exit status 1与exit status 145
  20. 我的博客在百度:http://hi.baidu.com/sunmoonzhangli

热门文章

  1. 【题解】CF#960 H-Santa's Gift
  2. GDALSetProjection使用的一个注意事项
  3. vscode创建代码片段
  4. MySQL巧妙利用help_topic表把以逗号分隔的字符串转换成行
  5. 帆软条件判断是否包含指定字符串
  6. 科普:为什么 String hashCode 方法选择数字31作为乘子
  7. flash as3笔记1
  8. Codeforces 319C DP 斜率优化
  9. leetcode Longest Consecutive Sequence
  10. Linux常用命令——关机重启命令