数据结构之矩阵与矩阵乘法

#include<iostream>
using namespace std;
typedef struct TwoDArray{
	int rows;
	int columns;
	int** elements;
}TwoDArray,*TwoDArrayPtr;; 
typedef struct TwoDStaticArray{
	int rows;
	int columns;
	int elements[4][5];
}TwoDStaticArray,*TwoDStaticArrayPtr;
TwoDArrayPtr initTwoDArray(int paraRows, int paraColumns){
	TwoDArrayPtr resultPtr=(TwoDArrayPtr)malloc(sizeof(TwoDArray));
	resultPtr->rows=paraRows;
	resultPtr->columns=paraColumns;
	resultPtr->elements=(int**)malloc(sizeof(int*)*paraRows);
	for(int i=0;i<paraRows;i++){
		resultPtr->elements[i]=(int*)malloc(sizeof(int)*paraColumns);
	}
	return resultPtr;
}
void randomizeTwoDArray(TwoDArrayPtr paraPtr,int paraLowerBound,int paraUpperBound){
	for(int i=0;i<paraPtr->rows;i++){
		for(int j=0;j<paraPtr->columns;j++){
			paraPtr->elements[i][j]=rand()%(paraUpperBound-paraLowerBound)+paraLowerBound;
		}
	}
}
void printTwoDArray(TwoDArrayPtr paraPtr){
	for(int i=0;i<paraPtr->rows;i++){
		for(int j=0;j<paraPtr->columns;j++){
			printf("%d ",paraPtr->elements[i][j]);
		}
		printf("\r\n");
	}
}
TwoDArrayPtr matrixMultiply(TwoDArrayPtr paraPtr1,TwoDArrayPtr paraPtr2){
	if(paraPtr1->columns!=paraPtr2->rows){
		printf("Matrices cannot be multiplied.\r\n");
		return nullptr;
	}
	int sum=0;
	TwoDArrayPtr resultPtr=initTwoDArray(paraPtr1->rows,paraPtr2->columns);
	for(int i=0;i<paraPtr1->rows;i++){
		for(int j=0;j<paraPtr2->columns;j++){
			sum=0;
			for(int k=0;k<paraPtr1->columns;k++){
				sum+=paraPtr1->elements[i][k]*paraPtr2->elements[k][j];
			}
			resultPtr->elements[i][j]=sum;
			printf("sum = %d ",sum);
		}
	}
	return resultPtr;
}
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);
}
TwoDStaticArrayPtr initTwoDStaticArray(){
	TwoDStaticArrayPtr resultPtr=(TwoDStaticArrayPtr)malloc(sizeof(struct TwoDStaticArray));
	resultPtr->rows=4;
	resultPtr->columns=5;
	for (int i=0;i<4;i++){
		for (int j=0;j<5;j++){
			resultPtr->elements[i][j]=i*10+j;
			printf("(%d, %d): %d; ",i,j,&(resultPtr->elements[i][j]));
		}
	}
    return resultPtr;
}
int main(){
	twoDArrayTest();
	TwoDStaticArrayPtr tempPtr=initTwoDStaticArray();
	return 0;
}

这段代码涉及了C++中的矩阵操作和动态内存分配。以下是我对这段代码的学习心得:

  1. 数据结构定义

    • 定义了两种不同的数据结构:TwoDArray 和 TwoDStaticArray,分别用于动态和静态二维数组。
    • TwoDArray 使用指针来表示二维数组的行和列,并动态分配内存以存储元素。
    • TwoDStaticArray 使用固定大小的二维数组来存储元素。
  2. 函数实现

    • initTwoDArray 函数用于初始化动态二维数组,动态分配内存以存储数组元素。
    • randomizeTwoDArray 函数用于为二维数组随机赋值。
    • printTwoDArray 函数用于打印二维数组的元素。
    • matrixMultiply 函数用于矩阵相乘操作,检查矩阵是否可以相乘,并返回结果矩阵。
  3. 测试函数

    • twoDArrayTest 函数用于测试动态二维数组的初始化、赋值、打印和矩阵相乘操作。
  4. 静态数组初始化

    • initTwoDStaticArray 函数用于初始化静态二维数组,直接在函数内部为数组赋值并打印元素的地址。
  5. 学习心得

    • 通过这段代码,我学习了如何使用指针和动态内存分配来处理二维数组。
    • 矩阵相乘的实现让我更加熟悉了矩阵运算的基本原理。
    • 理解了动态数组和静态数组在内存分配和使用上的区别。
    • 总体而言,这段代码帮助我加深了对C++中数组和指针的理解,以及如何进行矩阵操作和内存管理的知识。
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值