C语言——矩阵转置

news/2024/10/18 23:24:49/

矩阵转置的原理:行元素变成列元素,列元素变成行元素

例如:

\begin{bmatrix} 1 &2 &3 &4 \\ 5&6 &7 &8 \\ 9 &10 &11 &12 \end{bmatrix}\rightarrow \begin{bmatrix} 1 &5 &9 \\ 2&6 &10 \\ 3&7 &11 \\ 4&8 &12 \end{bmatrix}

矩阵转置代码 

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<math.h>//矩阵转置
double** Matrix_T(double** arr)
{if(arr==NULL)exit(-1);int row = (int)_msize(arr) / (int)sizeof(double*);int col = (int)_msize(*arr) / (int)sizeof(double);double** T = (double**)malloc(sizeof(double*) * col);int i = 0;int j = 0;if (T != NULL){for (i = 0; i < col; i++){T[i] = (double*)malloc(sizeof(double) * row);}}for (i = 0; i < col; i++){for (j = 0; j < row; j++){T[i][j] = arr[j][i];}}return T;
}

上述代码中:

  • 首先判断传入指针是否为空
  • 然后判断矩阵的维数,这部分在C语言判断矩阵维数中有详细讲解
  • 为转置后的矩阵开辟空间
  • 进行矩阵装置,行列互换传参 

上述方法使用的是malloc开辟的矩阵,该方法相对于用二维数组存储矩阵有以下几种优势:

1)函数传参时不用输入行列,只需传入指针

2)矩阵的大小可以未知,矩阵维数可以更改

3)不需要宏定义,程序可移植性高

malloc开辟矩阵的代码如下:

double** Make_Matrix(int row, int col)
{int i, j;double** arr = (double**)malloc(sizeof(double*) * row);if (arr != NULL){for (i = 0; i < row; i++){arr[i] = (double*)malloc(sizeof(double) * col);}}return arr;
}

该方法在C语言malloc开辟矩阵中有详细介绍。 

测试:

为了方便测试,再加入初始化矩阵和打印矩阵两个函数

初始化函数 

void Init_Matrix(double** arr)
{int i, j;int row = (int)_msize(arr) / (int)sizeof(double*);int col = (int)_msize(*arr) / (int)sizeof(double);for (i = 0; i < row; i++){for (j = 0; j < col; j++){arr[i][j] = pow(i,j);}}
}

 为了更加直观,让每个元素等于 i 的 j 次方

打印函数 

//打印矩阵
void print(double** arr)
{putchar('\n');int i, j, row, col;row = (int)_msize(arr) / (int)sizeof(double*);col = (int)_msize(*arr) / (int)sizeof(double);for (i = 0; i < row; i++){for (j = 0; j < col; j++){printf("%8.3lf ", arr[i][j]);}putchar('\n');}
}

主函数测试 

int main()
{int i = 3;int j = 5;double** arr = Make_Matrix(i, j);Init_Matrix(arr);double** res = Matrix_T(arr);printf("原矩阵:>");print(arr);printf("逆矩阵:>");print(res);return 0;
}


http://www.ppmy.cn/news/701.html

相关文章

25K 入职腾讯的那天,我哭了...

悲催的经历&#xff1a; 先说一下自己的个人情况&#xff0c;计算机专业&#xff0c;17 年本科毕业&#xff0c;一毕业就进入了“阿里”测试 岗(进去才知道是接了个阿里外包项目&#xff0c;可是刚毕业谁知道什么外包不外包的)。 更悲催的是&#xff1a;刚入职因为家里出现一…

【LIMU-Bert论文阅读】

LIMU-BERT: Unleashing the Potential of Unlabeled Data for IMU Sensing Applications 题目重点&#xff1a; 充分利用无标签数据适用于IMU传感器应用&#xff08;并没有指出specfic task&#xff09; 文章核心&#xff1a; 如何根据IMU数据的特征设计出LIMU-Bert&#xff0c…

UE5笔记【十一】蓝图变量BluePrint Variables

类似于在材料中将配置参数化&#xff0c;我们这里也可以将配置变量化。最后实现在对象detail细节中设置修改。 在左侧组件中找到【变量】&#xff0c;然后点击那个加号&#xff0c;添加两个变量用来控制楼梯和盒体的升降速度。 分别命名为&#xff1a;BoxSpeed和StairSpeed。然…

Spring Security基于jwt实现权限校验

一 引言 在基于springsecurity和jwt实现的单体项目token认证中我实现了基于jwt实现的认证,本文在此基础上继续实现权限认证 用户认证成功后携带jwt发起请求,请求被AuthenticationFilter拦截到,进行jwt的校验jwt校验成功后,调用JwtAuthenticationProvider从jwt中获得权限信息…

Android Audio常见问题分析方法

Audio常见问题分析方法无声断音杂音设备切换延迟播放焦点问题多路录音有线耳机蓝牙控制类问题播放时间有问题声音在不同应用中切换的问题无声问题&#xff08;连上BT&#xff09;音质问题录音路由问题BT audio分析总结无声 整机无声&#xff08;bt和手机一起播放声音时&#x…

NLP中的对抗训练(附PyTorch实现)

对抗样本的基本概念 要认识对抗训练&#xff0c;首先要了解"对抗样本"&#xff0c;它首先出现在论文Intriguing properties of neural networks之中。简单来说&#xff0c;它是指对于人类来说"看起来"几乎一样&#xff0c;但对于模型来说预测结果却完全不…

java计算机毕业设计中小型超市管理系统源程序+mysql+系统+lw文档+远程调试

java计算机毕业设计中小型超市管理系统源程序mysql系统lw文档远程调试 java计算机毕业设计中小型超市管理系统源程序mysql系统lw文档远程调试本源码技术栈&#xff1a; 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 开发软件&#xff1a;idea eclipse 前端技…