C语言矩阵运算

article/2025/9/23 4:22:16

矩阵的乘法:

矩阵的列数(column)和第二个矩阵的行数(row)相同时

 

#include<stdio.h>int main()
{   int a[2][4], b[4][3], c[2][3];int i, j, k, sum; printf("输入一个2×4的矩阵:\n"); for(i=0;i<2;i++)                    //处理矩阵a中的一行中各元素for(j=0;j<4;j++)               //处理矩阵a中某一列中各元素scanf("%d",&a[i][j]);   //输入数据printf("输入一个4×3的矩阵;\n"); for(i=0;i<4;i++)                   //处理矩阵b中的一行中各元素for(j=0;j<3;j++)               //处理矩阵b中某一列中各元素scanf("%d",&b[i][j]);    //输入数据for(i=0;i<2;i++)                 //对矩阵c进行处理{	for(j=0;j<3;j++)             {	sum=0;for(k=0;k<4;k++)   //矩阵c中每一个元素的循环计算{   sum+=a[i][k]*b[k][j]; //对矩阵c中的某一元素进行计算}c[i][j]=sum;           //给矩阵c中的某一元素进行赋值}	}printf("得到一个2×3的矩阵:\n");for(i=0;i<2;i++)            //输出矩阵c{for(j=0;j<3;j++)	 printf("%5d",c[i][j]);printf("\n");}
}

矩阵运算:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>double value[] = {1,2,3,4,5,6,7,8,9};
double value2[] = {9,8,7,6,5,4,3,2,1};typedef struct 
{int row,line;		//line为行,row为列double *data;
}Matrix;Matrix* InitMatrix(Matrix *matrix,int row,int line);		//初始化矩阵
void ValueMatrix(Matrix *matrix,double *array);				//给一个矩阵赋值
int SizeMatrix(Matrix *matrix);								//获得一个矩阵的大小
void FreeMatrix(Matrix *matrix);							//释放一个矩阵
void CopyMatrix(Matrix *matrix_A, Matrix *matrix_B);		//复制一个矩阵的值
void PrintMatrix(Matrix *matrix);							//打印一个矩阵//矩阵的基本运算
Matrix* AddMatrix(Matrix *matrix_A,Matrix *matrix_B);		//矩阵的加法
Matrix* MulMatrix(Matrix *matrix_A,Matrix *matrix_B);		//矩阵的乘法
void TransMatrix(Matrix *matrix);			//条件为方阵int main(int argc,char* argv[])
{Matrix *matrix1 = InitMatrix(matrix1,3,3);Matrix *matrix2 = InitMatrix(matrix2,3,3);ValueMatrix(matrix1,value);// CopyMatrix(matrix1,matrix2);	//复制赋值ValueMatrix(matrix2,value2);printf("矩阵1 乘以 矩阵2: \n");Matrix *matrix3 = MulMatrix(matrix1,matrix2);	//乘法PrintMatrix(matrix3);	printf("矩阵1 加上 矩阵2: \n");Matrix *matrix4 = AddMatrix(matrix1,matrix2);	//加法PrintMatrix(matrix4);printf("矩阵1进行转置: \n");TransMatrix(matrix1);					//转置PrintMatrix(matrix1);return 0;
}Matrix* InitMatrix(Matrix *matrix,int row,int line)				//初始化一个矩阵
{if (row>0 && line>0){matrix = (Matrix*)malloc(sizeof(Matrix));matrix->row = row;matrix->line = line;matrix->data = (double*)malloc(sizeof(double)*row*line);memset(matrix->data,0,sizeof(double)*row*line);return matrix;}else return NULL;
} void ValueMatrix(Matrix *matrix,double *array) 		//给矩阵赋值
{if (matrix->data != NULL){memcpy(matrix->data, array, matrix->row*matrix->line*sizeof(double));}
}int SizeMatrix(Matrix *matrix)
{return matrix->row*matrix->line;
}void FreeMatrix(Matrix *matrix)
{free(matrix->data);		//释放掉矩阵的data存储区matrix->data = NULL;printf("释放成功\n");
}void CopyMatrix(Matrix *matrix_A, Matrix *matrix_B)
{matrix_B->row = matrix_A->row;matrix_B->line = matrix_A->line;memcpy(matrix_B->data, matrix_A->data, SizeMatrix(matrix_A)*sizeof(double));
}void PrintMatrix(Matrix *matrix)
{for (int i=0;i<SizeMatrix(matrix);i++){printf("%lf\t", matrix->data[i]);if ((i+1)%matrix->line == 0)printf("\n");}}
//加法
Matrix* AddMatrix(Matrix *matrix_A,Matrix *matrix_B)
{if (matrix_A->row == matrix_B->row && matrix_A->line == matrix_B->line){Matrix *matrix_C = InitMatrix(matrix_C,matrix_A->row,matrix_A->line);for (int i=0;i<matrix_A->line;i++){for (int j=0;j<matrix_A->row;j++){matrix_C->data[i*matrix_C->row + j] = \matrix_A->data[i*matrix_A->row + j] + matrix_B->data[i*matrix_A->row + j];}}return matrix_C;}else {printf("不可相加\n");return NULL;}
}//乘法
Matrix* MulMatrix(Matrix *matrix_A,Matrix *matrix_B)
{if (matrix_A->row == matrix_B->line)		//列==行{Matrix *matrix_C = InitMatrix(matrix_C,matrix_B->row,matrix_A->line);// matrix_C->line = matrix_A->line;		//A行// matrix_C->row = matrix_B->row;			//B列for (int i=0;i<matrix_A->row;i++){for (int j=0;j<matrix_B->line;j++){for (int k=0;k<matrix_A->line;k++){matrix_C->data[i*matrix_C->line + j] += \matrix_A->data[i*matrix_A->line + k] * matrix_B->data[k*matrix_B->row + j];}}}return matrix_C;}else{printf("不可相乘\n");return NULL;}
}//矩阵转置
void TransMatrix(Matrix *matrix)			//条件为方阵
{if (matrix->row == matrix->line){Matrix *matrixTemp = InitMatrix(matrixTemp, matrix->row,matrix->line);       	//创建一个临时矩阵CopyMatrix(matrix,matrixTemp);	//将目标矩阵的data复制给临时矩阵for (int i=0;i<matrix->row;i++){for (int j=0;j<matrix->line;j++){matrix->data[i*matrix->row + j] = matrixTemp->data[j*matrix->row + i];}}}else{printf("转置的矩阵必须为方阵\n");}
}

矩阵加减、数乘运算例子:

/**
MatrixAddition.c
实现两个矩阵相加
*/
#include<stdio.h>
const int COLS=3;
void printMatirx(int *pArray,int rows,int cols);
void printMatirx2(int (*pArray)[COLS],int rows);
int main()
{int A[3][4]={{15,10,9,12},{18,14,8,7},{16,13,6,11}};printf("矩阵A=\n");printMatirx(A,3,4);int B[3][4]={{4,3,5,2},{0,9,6,1},{5,7,2,6}};printf("矩阵B=\n");printMatirx(B,3,4);int C[3][4];int i,j;//矩阵相加:两个矩阵必须行数和列数一样才能相加,//和矩阵的每个元素分别是两个矩阵对应的元素的和printf("矩阵A+矩阵B=\n");for(i=0;i<3;i++)//控制行{for(j=0;j<4;j++){C[i][j]=A[i][j]+B[i][j];
//            printf("%3d",C[i][j]);//输出结果}
//        printf("\n");}int (*p)[COLS]=C;printMatirx2(p,3);
/*结果应为:
19 13 14 14
18 23 14  8
21 20  8 17
*/printf("矩阵C-矩阵A=\n");for(i=0;i<3;i++)//控制行{for(j=0;j<4;j++){printf("%3d",C[i][j]-A[i][j]);//输出结果}printf("\n");}/*结果应为:4  3  5  20  9  6  15  7  2  6*///矩阵数乘:int D[3][4];printf("矩阵D:\n");for(i=0;i<3;i++)//控制行{for(j=0;j<4;j++){D[i][j]=1;printf("%d\t", D[i][j]);//输出结果}printf("\n");}int mul;printf("矩阵D数乘以:");scanf("%d",&mul);printf("矩阵D数乘以%d=\n",mul);for(i=0;i<3;i++)//控制行{for(j=0;j<4;j++){D[i][j]=D[i][j]*mul;printf("%d\t", D[i][j]);//输出结果}printf("\n");}return 0;
}
//使用一级指针来访问二维数组
void printMatirx(int *pArray,int rows,int cols)
{int i;int j;for(i=0;i<rows;i++){for(j=0;j< cols;j++){printf("%d\t",*(pArray+i*cols+j));}printf("\n");}
}
//使用指向一维数组的指针,访问二维数组
void printMatirx2(int (*pArray)[COLS],int rows)
{int i,j;for(i=0;i<rows;i++){for(j=0;j<COLS;j++){printf("%d\t",pArray[i][j]);/*[]运算符的结合方向是由左向右,pArray[1][2]就等价于(* (pArray + 1))[2],而由于pArray是数组指针,而且数组的长度为3,所以* (pArray + 1):表示跨过3个元素,而也就是到array第二行即表示array[1]这个数组,则pArray[1][2]则就完全等价于array[1][2]。*/}printf("\n");}
}


http://chatgpt.dhexx.cn/article/dAHitgKi.shtml

相关文章

c语言矩阵的乘法

矩阵的乘法&#xff1a; 两个矩阵只有在第一个矩阵的列数&#xff08;column&#xff09;和第二个矩阵的行数&#xff08;row&#xff09;相同时才有意义。一般单指矩阵乘积时&#xff0c;指的便是一般矩阵乘积。一个mn的矩阵就是mn个数排成m行n列的一个数阵。 运算规则&#x…

C语言刷题小结---矩阵篇

电影黑客帝国有很多这样的场景 用矩阵表示我们看到的一切&#xff01; 而在编程中矩阵是用数组来表示的 目前小作者还只是学习编程的初学者&#xff0c;很多知识内容都还没有学习。但相信每一个学习编程的小伙伴在做C语言方面的练习时都会遇到有关矩阵相关的题目&#xff0c;…

《C语言》矩阵问题

一.矩阵乘法 1.定理&#xff1a; 两个矩阵的乘法仅当第一个矩阵A的列数和另一个矩阵B的行数相等时才能定义。如A是mn矩阵和B是np矩阵&#xff0c;它们的乘积C是一个mp矩阵。 例如&#xff1a; 2.思路 1. i&#xff0c;j分别代表行和列&#xff0c;所以应该定义一个二维矩阵&…

C语言矩阵乘法

本篇内容 1&#xff09;首先介绍了矩阵乘法的基本原理&#xff1b; 2&#xff09;然后介绍了相对初阶的C语言乘法代码设计&#xff1b; 3&#xff09;最后根据C语言动态内存规划&#xff0c;提出了更加便捷、优化的代码设计&#xff0c;希望能给大家带来帮助。 更新&#xff1a…

c语言之矩阵

矩阵作为线性代数核心内容之一也是刷题人时常会遇到的一种类型。本篇博客简单介绍一下矩阵转置、上三角矩阵以及杨氏矩阵。 1.转置矩阵&#xff1a;输入m行n列的矩阵以n行m列的方式打印出来。只要将数组的行列进行交换即可&#xff0c;并不难想也不难写.&#xff08;相应练习&a…

vue-quill-editor 使用-图片上传

vue 项目开发中&#xff0c;文本编辑器的选择很多&#xff0c;一些熟悉的文本编辑器都可以使用&#xff0c;如UEditor、wangEditor&#xff0c;这里介绍基于 vue 的一个文本编辑器插件 vue-quill-editor 此插件基于 quill&#xff0c;所以使用 cdn 节点方式引用时&#xff0c;…

Error: Cannot find module ‘./XXX.jpg‘ 问题解决 Vue动态显示图片

刚开始学习Vue 在循环输出图片时&#xff0c;浏览器报错Error: Cannot find module ‘./tqwl.jpg’ 这张图片是放在本地文件夹内的 这是图片的展示代码 <el-table-column label"展示" width"180"><template slot-scope"scope"><…

解决js中获取不到图片路径的情况

在写一个todoList作品时&#xff0c;需要点击事件更改图片路径时&#xff0c;遇到了获取不到图片路径的情况 在html中用src“”来获取的图片&#xff0c;凭主观臆想觉得在js中判断它的路径时&#xff0c;没有作用&#xff0c;控制台中显示的不是我们熟悉的路径格式 查阅得知&a…

vue-quill-editor删除服务器多余图片

这几天在做富文本编辑业务&#xff0c;在删除服务器资源方面遇到了问题&#xff0c;网上搜索了很久都没找到办法&#xff0c;现在把自己解决的过程记录如下&#xff1a;思路&#xff1a; 点击工具栏的图标&#xff0c;选取图片&#xff08;不是base64格式&#xff09;上传到服…

将JS代码隐藏在图片中的方法

之前写过利用图片重写的方法清除图片中恶意代码的文章&#xff0c;java清除恶意代码 &#xff0c;但这些图片中的恶意代码是怎么植入进去的呢&#xff0c;有简便方法&#xff0c;也有复杂方法。先来看如下这张图片&#xff0c;是Google的LOGO&#xff0c;是一张完全正常的png图…

VUE-QUILL-EDITOR安装与调节图片大小记录

一、quill-editor安装 安装quill-editor npm install vue-quill-editor --save安装调节图片大小插件(不是必须的&#xff0c;看需求) npm install quill-image-resize-module -S二、 引用&#xff08;两种方式&#xff09; 全局引用 在main.js中填入以下代码 import Vue f…

将js/css脚本放到png图片中的实践。

起因 高级浏览器支持data协议,如: 参考:http://en.wikipedia.org/wiki/Data:_URL <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6…

[JS插件] PhotoSwipe 图片浏览插件使用方法

一、介绍 PhotoSwipe 是专为移动触摸设备设计的相册/画廊.兼容所有iPhone、iPad、黑莓6,以及桌面浏览器.底层实现基于HTML/CSS/JavaScript,是一款免费开源的相册产品。 官方网站&#xff1a;http://photoswipe.com/ 源码下载&#xff1a;https://github.com/dimsemenov/photo…

原生js 图片查看器

将以前用angular 写的 自定义指令 封装成 插件&#xff0c;无需引用jquery、angular。 下载下来即可查看效果。 github网址: GitHub - wzhGitH/imgView: js 图片查看器,H5图片预览(imgView) 百度云下载链接: 百度网盘 请输入提取码 密码: gidq 可实现放大、缩小、拖拽、旋转…

vue-quill-editor拖拽或粘贴的图片上传到服务器回显插入图片后删除生成的Base64图片

问题描述&#xff1a;拖拽或粘贴图片上传到服务器后返回url插入富文本编辑器后&#xff0c;quill默认生成的base64图片链接也同时出现在富文本编辑器中&#xff0c;等于是有两张相同的图片&#xff0c;一张是我们服务器图片&#xff0c;一张是base64格式图片&#xff01;&#…

Unity3D在UI中加入Image图片

在将图片拖入到Assets后发现根本不能将图片拖入到UI中&#xff1a; 新建Image后在Source Image中也不能找到图片&#xff1a; 那是因为你没把图片设置为Sprite&#xff0c;图片只是Texture而已&#xff0c;只能作为贴图使用。 可以将图片设置为Sprite: 这样一切就正常了&#…

纯JS图片查看器

目前支持&#xff1a;放大、缩小&#xff08;含滚轮&#xff09;、旋转、还原 /*** 说明信息* date 2022/10/13 19:46:44* 初始化图片查看器* date 2022/09/21 14:40:06* id 唯一标识&#xff0c;指定id区域内的图片* params 扩展参数&#xff0c;设置图片大小&#xff0c;目前…

vue-quill-editor上传图片

问题&#xff1a; vue-quill-editor富文本编辑器上传图片默认为base64&#xff0c;存入数据库过于过于庞大&#xff0c;使用quill-image-extend-modulevue-quill-editor实现图片地址上传。 解决完之后效果图&#xff1a; 解决思路&#xff1a; 哈哈&#xff0c;第一步当然去…

unity UI 加入image图片

1.新建画布&#xff0c;新建image. 2.我们发现这个时候把Assets里的图片直接拖到Image上是行不通的。原因就是此时的图片没有设为sprite. 处理方法&#xff1a;点击图片&#xff0c;修改Texture Type为Sprite. 下图左边图片为调整后&#xff0c;右边图片为没有调整. 3.调整后就…