当前位置: 首页 > news >正文

5.2压缩矩阵的转置

#include <stdio.h>

#include <malloc.h>

#include <stdlib.h>

#define ROWS 4

#define COLUMNS 5

/**

* 动态二维数组结构体

*/

typedef struct TwoDArray{

int rows; // 行数

int columns; // 列数

int** elements; // 二级指针存储数组元素

} TwoDArray, *TwoDArrayPtr;

/**

* 静态二维数组结构体

*/

typedef struct TwoDStaticArray{

int rows;

int columns;

int elements[ROWS][COLUMNS]; // 固定大小数组

} TwoDStaticArray, *TwoDStaticArrayPtr;

/**

* 初始化动态二维数组

*/

TwoDArrayPtr initTwoDArray(int paraRows, int paraColumns){

int i;

TwoDArrayPtr resultPtr = (TwoDArrayPtr)malloc(sizeof(struct TwoDArray));

resultPtr->rows = paraRows;

resultPtr->columns = paraColumns;

resultPtr->elements = (int**)malloc(paraRows * sizeof(int*));

for (i = 0; i < paraRows; i ++){

resultPtr->elements[i] = (int*)malloc(paraColumns * sizeof(int));

}//Of for i

return resultPtr;

}// Of initTwoDArray

/**

* 给数组随机赋值

*/

void randomizeTwoDArray(TwoDArrayPtr paraPtr, int paraLowerBound, int paraUpperBound){

int i, j;

for (i = 0; i < paraPtr->rows; i ++){

for (j = 0; j < paraPtr->columns; j ++) {

paraPtr->elements[i][j] = rand() % (paraUpperBound - paraLowerBound) + paraLowerBound;

}//Of for j

}//Of for i

}// Of randomizeTwoDArray

/**

* 打印二维数组

*/

void printTwoDArray(TwoDArrayPtr paraPtr){

int i, j;

for (i = 0; i < paraPtr->rows; i ++){

for (j = 0; j < paraPtr->columns; j ++) {

printf("%d, ", paraPtr->elements[i][j]);

}//Of for j

printf("\r\n");

}//Of for i

}// Of initTwoDArray

/**

* 矩阵乘法运算

*/

TwoDArrayPtr matrixMultiply(TwoDArrayPtr paraPtr1, TwoDArrayPtr paraPtr2){

int i, j, k, sum;

// 判断是否满足矩阵相乘条件

if (paraPtr1->columns != paraPtr2->rows){

printf("Matrices cannot be multiplied.\r\n");

return NULL;

}//Of if

TwoDArrayPtr resultPtr = initTwoDArray(paraPtr1->rows, paraPtr2->columns);

// 三层循环实现矩阵相乘

for (i = 0; i < paraPtr1->rows; i ++){

for (j = 0; j < paraPtr2->columns; j ++) {

sum = 0;

for (k = 0; k < paraPtr1->columns; k ++) {

sum += paraPtr1->elements[i][k] * paraPtr2->elements[k][j];

}//Of for k

resultPtr->elements[i][j] = sum;

printf("sum = %d, ", sum);

}//Of for j

}//Of for i

return resultPtr;

}// Of matrixMultiply

/**

* 动态二维数组测试

*/

void twoDArrayTest(){

TwoDArrayPtr tempPtr1, tempPtr2, tempPtr3;

tempPtr1 = initTwoDArray(3, 2);

randomizeTwoDArray(tempPtr1, 1, 5);

printf("The first matrix:\r\n");

printTwoDArray(tempPtr1);

tempPtr2 = initTwoDArray(2, 4);

randomizeTwoDArray(tempPtr2, 4, 9);

printf("The second matrix:\r\n");

printTwoDArray(tempPtr2);

tempPtr3 = matrixMultiply(tempPtr1, tempPtr2);

printf("The result:\r\n");

printTwoDArray(tempPtr3);

}//Of twoDArrayTest

/**

* 初始化静态二维数组,输出元素地址

*/

TwoDStaticArrayPtr initTwoDStaticArray(){

int i, j;

TwoDStaticArrayPtr resultPtr = (TwoDStaticArrayPtr)malloc(sizeof(struct TwoDStaticArray));

resultPtr->rows = ROWS;

resultPtr->columns = COLUMNS;

for (i = 0; i < ROWS; i ++){

for (j = 0; j < COLUMNS; j ++) {

resultPtr->elements[i][j] = i * 10 + j;

//Print their addresses.

printf("(%d, %d): %d; ", i, j, &(resultPtr->elements[i][j]));

}//Of for j

}//Of for i

return resultPtr;

}// Of initTwoDStaticArray

/**

* 程序入口

*/

int main(){

twoDArrayTest();

TwoDStaticArrayPtr tempPtr = initTwoDStaticArray();

return 1;

}// Of main

知识点总结

1. 区分静态二维数组和动态二维数组,静态大小固定,动态可灵活指定行列。

2. 动态二维数组依靠二级指针配合内存分配实现,使用更灵活。

3. 矩阵相乘规则:第一个矩阵列数等于第二个矩阵行数。

4. 利用 rand() 函数可快速给数组批量生成随机数值。

5. 可通过打印地址,直观观察数组元素内存分布规律。

http://www.gsyq.cn/news/1339856.html

相关文章:

  • 西安装修公司哪家好 2026 权威数据告诉你答案 - 资讯纵览
  • 口碑最好的AI写作辅助平台推荐(从文献整理到论文成稿全流程)适合全体毕业生
  • C++学习(3):C++ for What n Why
  • 小资金期货量化用什么软件:成本敏感型的现实选项
  • 产品经理把PRD写成“天书”,我用AI半小时重写了一遍,他当场愣住
  • 2026山东首台(套)申报启动!第三方检测报告避坑与办理全攻略
  • LinkSwift网盘直链下载助手:9大平台一键解析,彻底告别下载限速
  • 90%传感器信号漂移!就靠这三板斧搞定
  • 从零搭建 Geo 开源项目源码开发环境——以 GeoServer 为例
  • 当 AI 学会“说谎“:大模型幻觉问题深度解析
  • 如何突破百度网盘限速:baidu-wangpan-parse工具终极指南
  • 114、MPC:嵌入式MPC实现技巧
  • Java第五次作业:了解java的反射机制
  • 从零开始构建现代Android音乐播放器:APlayer的3个关键突破
  • C 进阶(10) - 线程
  • 2026 一体化泵站厂家实力排行 本土优品多场景实用选型指南 - 资讯速览
  • RabbitMQ(七大模式+微服务+自用)
  • WorkBuddy(腾讯龙虾)开发 Minifilter文件系统过滤驱动
  • 大型语言模型走向专业化:多领域新型模型助力专业人士,成本效率双提升!
  • 如何在Docker容器中高效运行Android模拟器:完整实践指南
  • GetQzonehistory技术解析:构建高效的QQ空间历史数据备份系统
  • 洛雪音乐六音音源修复完整指南:快速恢复音乐播放功能
  • SGLang 多 GPU 分布式推理:张量并行与流水线并行的工程实践
  • Honey Select 2终极增强补丁:一站式游戏体验优化方案
  • ZeroOmega:浏览器代理切换的终极解决方案
  • 工业级知识图谱构建实践:建模、抽取、管理、计算、应用、演化六步法
  • 如何告别模组管理噩梦:XXMI启动器的3个革命性解决方案
  • 免费备份QQ空间历史记录的完整指南:5分钟永久保存你的青春记忆
  • 书匠策AI:拆解毕业论文的“全链路外挂“——一个教育博主的硬核科普
  • FineBI组件制作-表格