数据结构--3.1二维数组与矩阵乘法

结构体定义

#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(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));
	}
	
	return resultPtr;
 }//初始化二维数组

初始化

对于c语言来说,二维数组就是一个一维数组,只不过这个一维数组的每个元素又分别是一个一维数组。同理推广到三维数组甚至更高维。其次,c语言的的二维数组是以行序为主序的,即相当于二维数组的每一行单独是一个大的元素,第一行为第一个元素,第二行为第二个元素。
如下图:
在这里插入图片描述

 TwoDArrayPtr initTwoDArray(int paraRows,int paraColumns)
 {
 	int i;
 	TwoDArrayPtr resultPtr = (TwoDArrayPtr)malloc(sizeof(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));
	}
	
	return resultPtr;
 }//初始化二维数组

生成随机数

 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;
 			
		}
	}
 } //随机分配元素

矩阵相乘

矩阵相乘的要求是:tempPtr1的列要与tempPtr2的行相等。
三重循环中先循环完k后再循环j最后循环i,每循环完一层j都要重置sum

TwoDArrayPtr matrixMultiply(TwoDArrayPtr paraPtr1,TwoDArrayPtr paraPtr2 )
{
	int i,j,k,sum;
	if(paraPtr1->columns != paraPtr2->rows )
	{
		printf("can not multiplied.");
		return NULL;
	}
	
	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];
			}
			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);
}//测试程序

运行结果

The first matrix:
2, 4,
3, 1,
2, 1,
The second matrix:
7, 7, 6, 8,
4, 4, 5, 6,
sum = 30 sum = 30 sum = 32 sum = 40 sum = 25 sum = 25 sum = 23 sum = 30 sum = 18 sum = 18 sum = 17 sum = 22 The result:
30, 30, 32, 40,
25, 25, 23, 30,
18, 18, 17, 22,
(0,0); 10622456;(0,1); 10622460;(0,2); 10622464;(0,3); 10622468;(0,4); 10622472;(1,0); 10622476;(1,1); 10622480;(1,2); 10622484;(1,3); 10622488;(1,4); 10622492;(2,0); 10622496;(2,1); 10622500;(2,2); 10622504;(2,3); 10622508;(2,4); 10622512;(3,0); 10622516;(3,1); 10622520;(3,2); 10622524;(3,3); 10622528;(3,4); 10622532;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: "OIF-CEI-3.1" 是 OIF (Optical Internetworking Forum) 的一项协议规范,用于描述与光网络有关的特定功能和要求。OIF 是一个国际性组织,致力于推动光网络的发展和标准化。而 CEI (Common Electrical Interface) 是指在光纤通信系统中使用的一种电子接口标准。 OIF-CEI-3.1 是 OIF 为了提高光纤通信系统的传输效率而制定的一项技术规范。它旨在提供一种高速、可靠的电子接口标准,促进光纤通信系统的互操作性和可扩展性。 OIF-CEI-3.1 的主要特点和功能包括以下几个方面: 1. 高速传输:OIF-CEI-3.1 支持高达100 Gbps的数据传输速率,能够满足现代光纤通信系统对大带宽的需求。 2. 低功耗:OIF-CEI-3.1 的设计考虑了功耗优化,提供了节能的通信解决方案,有助于减少电力消耗和碳排放。 3. 信号完整性:OIF-CEI-3.1 提供了一套严格的电信号传输要求,包括时钟回复、抖动控制等,确保数据传输的可靠性和稳定性。 4. 灵活性和可扩展性:OIF-CEI-3.1 支持多种传输模式和物理层配置,能够适应不同的光纤通信场景和需求。 5. 互操作性:OIF-CEI-3.1 是一个开放的标准化协议,减少了不同供应商之间的兼容性问题,提高了设备之间的互操作性。 总的来说,OIF-CEI-3.1 是一个重要的光纤通信标准,旨在推动高速、低功耗、可靠的光纤通信系统的发展。它提供了一套规范和要求,使得不同设备和技术能够互相配合和兼容,为光网络的部署和应用提供了良好的支持。 ### 回答2: OIF-CEI-3.1是一种光学互连框架的标准,旨在通过提供高速、高效、互操作的光纤通信解决方案来促进光学层面的互连技术的发展。它定义了光学模块之间的接口标准,以确保不同供应商的光学设备能够无缝地协同工作。 OIF-CEI-3.1标准主要关注的是高速数据传输,它通过制定规范来确保光学设备之间的兼容性和稳定性。这有助于降低系统集成的复杂性,提高系统的性能和可靠性。 OIF-CEI-3.1标准支持多种传输速率,包括10、25、50和100 Gbps。它定义了物理层接口的电气规范、引脚功能和信号传输特性。这使得不同厂家的设备可以在相同的速率下相互连接,加强了市场竞争力,降低了用户的成本。 该标准还考虑了功耗的问题,通过优化设计和算法,减少了设备的能耗。此外,OIF-CEI-3.1也关注了时钟和时序的同步问题,确保数据的可靠性和稳定性。 总之,OIF-CEI-3.1标准是光纤通信领域的重要标杆,它推动了光学互连技术的发展,提高了系统的性能和可靠性。用户可以在不同供应商间选择适合自己需求的设备,并且能够在不同速率下进行互连,提高了系统的灵活性并降低了成本。 ### 回答3: OIF-CEI-3.1是光互操作性论坛(OIF)制定的一种光纤连接接口规范。OIF是一个国际组织,旨在推动和发展光纤通信技术的互操作性。OIF-CEI-3.1规范主要用于高速串行数据传输,如数据中心、互联网交换机等领域。 OIF-CEI-3.1规范通过定义高速信号传输时的电气特性和接口标准,确保不同厂商生产的设备之间能够正常互联。该规范对信号的传输速率、电压、时钟恢复等关键参数进行了详细说明,以确保数据传输的可靠性和稳定性。 OIF-CEI-3.1规范在技术上有一些改进和更新,以适应不断增长的数据传输需求。其中包括更高的传输速率、更低的功耗和更好的时钟恢复性能等。这些特性对于数据中心等应用领域来说十分重要,因为它们需要高速、可靠的数据传输,并且要尽可能降低功耗。 OIF-CEI-3.1规范的实施对于光纤连接技术的发展和应用有着积极的意义。它提高了设备之间的互操作性,降低了不同厂商设备之间的兼容性问题,促进了市场竞争和创新。此外,它还为数据中心等应用场景提供了更快速、更可靠的数据传输解决方案。 总之,OIF-CEI-3.1规范是一个具有重要意义的光纤连接接口标准,它通过定义电气特性和接口标准,确保高速数据传输的可靠性,推动了光纤通信技术的发展和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值