c语言——矩阵运算器

2023-11-19

话不多说,上代码!!

#include<stdio.h>
#include<stdlib.h>
int n,m;
float **a;//运用二重指针,避免二维数组做函数参数时长度未定情况 ;但是要先申请空间
void input() {
	int i,j;
	printf("请输入行数:");
	scanf("%d",&n);
	printf("请输入列数:");
	scanf("%d",&m);
	printf("请输入元素:\n");
	a=(float **)malloc(sizeof(float *)*n);//申请行空间
	for(i=0; i<n; i++) {
		a[i]=(float *)malloc(sizeof(float)*m);//申请列空间
		printf("第%d行:",i+1);
		for(j=0; j<m; j++) {
			scanf("%f",&a[i][j]);
		}
	}
}
void output(float **c,int p,int q) {
	int i,j;
	for(i=0; i<p; i++) {
		printf("第%d行:",i+1);
		for(j=0; j<q; j++) {
			printf("%.1f ",c[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}
void transform() {
	int i,j;
	float b[m][n];
	for(i=0; i<n; i++) {
		for(j=0; j<m; j++) {
			b[j][i]=a[i][j];
		}
	}
	for(i=0; i<m; i++) {//转置行数与列数互换
		for(j=0; j<n; j++) {
			printf("%.1f ",b[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}
void add() {
	int i,j;
	float c[n][m],d[n][m];//相加维数相同;不需要再定义阶数
	printf("请输入元素:\n");
	for(i=0; i<n; i++) {
		printf("第%d行:",i+1);
		for(j=0; j<m; j++) {
			scanf("%f",&c[i][j]);
		}
	}
	for(i=0; i<n; i++) {
		for(j=0; j<m; j++) {
			d[i][j]=a[i][j]+c[i][j];
		}
	}
	printf("相加后的矩阵为:\n");
	for(i=0; i<n; i++) {
		printf("第%d行:",i+1);
		for(j=0; j<m; j++) {
			printf("%.1f ",d[i][j]);
		}
		printf("\n");
	}
}
void multiply() {
	int i,j,k,r;
	float c[m][r],d[n][r];
	printf("请输入列数:");//相乘:第一个矩阵列数与第二个矩阵行数相同
	scanf("%d",&r);
	printf("请输入元素:\n");
	for(i=0; i<m; i++) {
		printf("第%d行:",i+1);
		for(j=0; j<r; j++) {
			scanf("%f",&c[i][j]);
		}
	}
	for(i=0; i<n; i++) {
		for(j=0; j<r; j++) {
			for(k=0; k<m; k++) {
				d[i][j]+=a[i][k]*c[k][j];
			}
		}
	}
	printf("相乘后的矩阵为:\n");
	for(i=0; i<n; i++) {
		printf("第%d行:",i+1);
		for(j=0; j<r; j++) {
			printf("%.1f ",d[i][j]);
		}
		printf("\n");
	}
}
float determinant(float **c,int n) {//按第一行完全展开式计算|A|
	float det,t,**temp1;
	temp1=(float **)malloc(sizeof(float *)*(n-1));//为储存降阶矩阵开辟空间
	for(int p=0; p<n-1; p++) {
		temp1[p]=(float *)malloc(sizeof(float)*(n-1));
	}
	if(n==2) {
		det=c[0][0]*c[1][1]-c[0][1]*c[1][0];//作为终止条件; 二阶矩阵直接计算 ;
	} else {
		for(int i=0; i<n; i++) {
			for(int j=0; j<n-1; j++) {//记录第一行元素对应余子式的矩阵
				for(int k=0; k<n-1; k++) {
					temp1[j][k]=c[j+1][(k>=i)?k+1:k];//若列数小于i则不变;若列数大于等于i则向后移动一列;从而记录余子式的矩阵
				}
			}
			t=determinant(temp1,n-1);//递归计算
			if(i%2==0) {//判断余子式的正负;与第一行元素相乘;相加得行列式
				det+=c[0][i]*t;
			} else {
				det-=c[0][i]*t;
			}
		}
	}
	return det;
}
float **adjoint(float **c,int n) {//计算每一行每一列的每个元素所对应的余子式,组成A*

	float **temp2,**adj;
	if(n==2) {
		adj=(float **)malloc(sizeof(float *)*n);               //为n阶伴随矩阵开辟空间
		for(int p=0; p<n; p++) {
			adj[p]=(float *)malloc(sizeof(float)*n);
		}
		adj[0][0]=a[1][1];
		adj[0][1]=(-1)*a[1][0];
		adj[1][0]=(-1)*a[0][1];
		adj[1][1]=a[0][0];

	} else {
		temp2=(float **)malloc(sizeof(float *)*(n-1));         //为n-1阶矩阵开辟空间
		for(int p=0; p<n-1; p++) {
			temp2[p]=(float *)malloc(sizeof(float)*(n-1));
		}
		adj=(float **)malloc(sizeof(float *)*n);               //为n阶伴随矩阵开辟空间
		for(int p=0; p<n; p++) {
			adj[p]=(float *)malloc(sizeof(float)*n);
		}
		for(int i=0; i<n; i++) {//每行
			for(int j=0; j<n; j++) {//每列
				for(int k=0; k<n-1; k++) {//n-1阶矩阵
					for(int t=0; t<n-1; t++) {
						temp2[k][t]=c[(k>=i)?k+1:k][(t>=j)?t+1:t];//剔除元素所在行与列之后的矩阵
					}
				}
				adj[j][i]=determinant(temp2,n-1);//计算代数余子式Aji为  转置  后的
				if((i+j)%2==1) {//判断符号(-1)^(i+j)
					adj[j][i]=-adj[j][i];
				}
			}
		}
	}
	return adj;
}

int main() {
	float z;
	float **adj,**bt;
	int flag=1;
	do {
		printf("初始化矩阵:1\n");
		printf("打印矩阵:  2\n");
		printf("矩阵转置:  3\n");
		printf("矩阵相加:  4\n");
		printf("矩阵相乘:  5\n");
		printf("矩阵求逆:  6\n");
		printf("伴随矩阵:  7\n");
		printf("退出程序:  0\n");
		int o;
		printf("请选择功能:");
		scanf("%d",&o);
		switch(o) {
			case 1:
				printf("请输入矩阵内容:\n");
				input();
				break;
			case 2:
				printf("矩阵内容为:\n");
				output(a,n,m);
				break;
			case 3:
				printf("转置后的矩阵为:\n");
				transform();
				break;
			case 4:
				printf("请输入新矩阵:\n");
				add();
				break;
			case 5:
				printf("请输入新矩阵:\n");
				multiply();
				break;
			case 6:
				bt=adjoint(a,n);
				z=determinant(a,n);//返回行列式的值
				if(z==0) {//判断是否可逆
					printf("\n矩阵不可逆!!\n");
				} else {
					printf("逆矩阵为:\n");
					for(int i=0; i<n; i++) {
						printf("第%d行:",i+1);
						for(int j=0; j<n; j++) {
							printf("%.1f ",bt[i][j]/z);//A逆==A*/|A|
						}
						printf("\n");
					}
				}
				break;
			case 7:
				printf("伴随矩阵为:\n");
				bt=adjoint(a,n);
				output(bt,n,n);
				break;
			case 0:
				flag=0;
				printf("感谢使用!!");
				break;
			default:
				printf("\n输入错误,请重新输入!!!!\n\n");
				break;
		}
	} while(flag);
}

仅为学习过程记录。

欢迎评论指正与优化!!!!! 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c语言——矩阵运算器 的相关文章

随机推荐

  • 物联网毕设分享 - stm32单片机酒精浓度酒驾检测系统 - 物联网 嵌入式

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 硬件设计 MQ 3酒精乙醇传感器模块 SIM800C模块 5 软件说明 系统框图 6 部分核心代码 7 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕
  • cityscapes和foggy_cityscapes数据集使用记录

    cityscapes和foggy cityscapes数据集使用记录 cityscapes 数据集介绍 下载数据集 cityscapes转voc格式 foggy cityscapes 下载数据集 foggy cityscapes转voc格式
  • linux drm 架构 基础

    一 简介 DRM 英文全称Digital Rights Management 可以翻译为 数字版权管理 由于数字化信息的特点决定了必须有另一种独特的技术 来加强保护这些数字化的音视频节目内容 文档 电子书籍的版权 该技术就是数字权限管理技术
  • PAT (Basic Level) Practice (中文) B1034 有理数四则运算 (20 分)(C++)(分数四则运算)

    1034 有理数四则运算 20 分 本题要求编写程序 计算 2 个有理数的和 差 积 商 输入格式 输入在一行中按照 a1 b1 a2 b2 的格式给出两个分数形式的有理数 其中分子和分母全是整型范围内的整数 负号只可能出现在分子前 分母不
  • openGL之API学习(一九三)glGenTextures

    生成纹理单元名 单元名不一定是连续的 但是没有使用的 单元名是相对GL TEXTURE0的 对于单元名1 其实是GL TEXTURE0 1 glGenTextures产生的是一个比较小的整数id 纹理单元名 glActiveTexture激
  • 三分钟带你搞懂分布式链路追踪系统原理

    分布式系统为什么需要链路追踪 随着互联网业务快速扩展 软件架构也日益变得复杂 为了适应海量用户高并发请求 系统中越来越多的组件开始走向分布式化 如单体架构拆分为微服务 服务内缓存变为分布式缓存 服务组件通信变为分布式消息 这些组件共同构成了
  • 前端学习——JavaScript原生实现购物车案例

    一 购物车案例 1 1 案例介绍 今天我们来写另外一个购物车案例 说实话对于我来说这个是花了将近三个小时的时间然后才做出来的 里面可能还存在一些我没有发现的问题 但是能完成基本的功能 对于一些基本的需求都是可以完成的 下面照旧是案例实现的g
  • [Python] wxPython 状态栏组件、消息对话框组件 学习总结(原创)

    1 状态栏组件 1 基本介绍 上图 红框框内的就是状态栏 他可以分成若干个区块 比如上者分为了两个区块 并且比例是固定的 创建时可以指定 每个区块都能够显示 信息 一般通过 绑定事件 实时更新 各个区块的内容 因为状态栏本身 组件 所以除了
  • Dubbo与SpringCloud的区别

    首先来看一个表格 Dubbo 和 SpringCloud 对比 Dubbo SpringCloud 服务注册中心 Zookeeper Spring Cloud Netfilx Eureka 服务调用方式 RPC REST API 服务监控
  • Mysql从入门到精通 (innodb 引擎 锁超时查看以及设置)

    1 查看innodb引擎锁超时时间 show variables like innodb lock wait timeout 2 设置锁超时时间 set innodb lock wait timeout 5 3 代码验证 两个窗口同时开启事
  • tensorflow gpu利用率低_TensorFlow 模型优化工具 — float16 量化将模型体积减半

    我们很高兴在模型优化工具包中添加训练后的半精度浮点量化 float16 quantization 此工具套件包含混合量化 hybrid quantization 训练后整形量化 full integer quantization 和剪枝 p
  • 双向长短期记忆网络(Bi-LSTM)

    在开始之前 首先区分下均命名为RNN 新手很容易混淆的两大神经网络 循环神经网络 Recurrent Neural Network RNN 和递归神经网络 Recurssion Neural Network RNN 递归神经网络 RNN 是
  • 跨时钟域处理方法(一)——打拍

    一 说明 处理跨时钟域的数据可以分为单bit数据和多bit数据 而打拍的方法主要常见于处理单bit数据的跨时钟域问题 打拍的本质是通过添加寄存器 对输入的数据进行延拍 其主要目标是消除亚稳态的影响 常见的是打2拍 也就是添加2级寄存器 二
  • 基于STM32单片机驱动HX711的代码分享,仅供参考

    最近在搞一个需要加入称重模块的项目 在调试的时候也是遇到了很够狗血的问题 也参考了别的工程师的设计 所以 闲话少叙 上代码 HX711 Dout PB9 HX711 SCK PB8 include hx711 h uint32 t HX71
  • 字符串转整形数据

    c 语言字符转化为数字的函数有 atof 将字符串转换为双精度浮点型值 atoi 将字符串转换为整型值 atol 将字符串转换为长整型值 strtod 将字符串转换为双精度浮点型值 并报告不能被转换的所有剩余数字 strtol 将字符串转换
  • 竞赛选题 卷积神经网络手写字符识别 - 深度学习

    文章目录 0 前言 1 简介 2 LeNet 5 模型的介绍 2 1 结构解析 2 2 C1层 2 3 S2层 S2层和C3层连接 2 4 F6与C5层 3 写数字识别算法模型的构建 3 1 输入层设计 3 2 激活函数的选取 3 3 卷积
  • 微信小程序api语法及代码实例(入门到精通)

    前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到网站 小程序Api App 全局入口 整个小程序项目中 只允许有一个App入口函数 全局数据 globalData 写在全局的js里 使用this
  • 设计模式之(三)---工厂方法模式

    女娲补天的故事大家都听过吧 这个故事是说 女娲在补了天后 下到凡间一看 哇塞 风景太优美了 天空是湛 蓝的 水是清澈的 空气是清新的 太美丽了 然后就待时间长了就有点寂寞了 没有动物 这些看的到 都是静态的东西呀 怎么办 别忘了是神仙呀 没
  • CTFSHOW web11-14

    目录 web11 web12 web13 web14 web11 其他不重要 直接看代码
  • c语言——矩阵运算器

    话不多说 上代码 include