当前位置: 首页 > 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.jsqmd.com/news/860105/

相关文章:

  • 西安装修公司哪家好 2026 权威数据告诉你答案 - 资讯纵览
  • C++学习(3):C++ for What n Why
  • 免费网络性能测试工具:iperf3 Windows版完整使用指南
  • Multisim 13.0 保姆级教程:手把手教你搭建丙类谐振功放,从波形观察到参数分析
  • TVS管解决路由器受ESD干扰WIFI掉线问题
  • 顶级研究员Karpathy跳槽Anthropic,押注预训练,AI行业格局或生变?
  • 给领导送红茶选哪个牌子?2026年五大红茶礼盒品牌横向测评
  • 144黄大年茶思屋榜文144期 第五题 鸿蒙复杂任务下 Code Agent 评测集构建方法研究
  • 使用 Python 快速将现有代码接入 Taotoken 多模型服务
  • 90%传感器信号漂移!就靠这三板斧搞定
  • Git for Unity深度解析:Unity开发者必备的版本控制高效方案
  • 645378
  • 2026山东首台(套)申报启动!第三方检测报告避坑与办理全攻略
  • LinkSwift网盘直链下载助手:9大平台一键解析,彻底告别下载限速
  • 如何用NVIDIA Profile Inspector实现终极显卡性能优化:新手快速上手指南
  • 35款专业模板:3步打造企业级PowerBI报表的终极方案
  • PTS 精密链节式输送线(精密凸轮链式分度输送系统)
  • 终极AnyFlip电子书下载指南:3步将在线翻页书转换为PDF
  • Chance AI获数百万美元天使轮融资,视觉智能体产品领先,剑指北美学生市场
  • 【算法】小白也能懂 · 第 13 节:回溯算法
  • Java第五次作业:了解java的反射机制
  • 独立开发者如何利用 Taotoken 的 Token Plan 套餐有效降低模型调用成本
  • 114、MPC:嵌入式MPC实现技巧
  • 工控机厂家怎么选?20年从业者告诉你这5个关键点
  • 智慧树刷课插件终极指南:如何实现自动播放与高效学习
  • 从零开始构建现代Android音乐播放器:APlayer的3个关键突破
  • 数据库连接池爆了,这3个命令能救你一次
  • Buzz音频转录工具:5个技巧让你彻底告别云端依赖
  • RabbitMQ(七大模式+微服务+自用)
  • 2026 一体化泵站厂家实力排行 本土优品多场景实用选型指南 - 资讯速览