C语言 矩阵乘法函数(dot)

1,457 阅读2分钟

函数功能

计算矩阵点乘

暂时包含的矩阵类型:

  1. 2维矩阵x2维矩阵
  2. 2维矩阵x1维矩阵
  3. 1维矩阵x1维矩阵

参数说明

  • inArr1:输入数组1
  • x1:数组1第一维长度
  • y1:数组1第二维长度
  • inArr2:输入数组2
  • x2:数组2第一维长度
  • y2:数组2第二维长度
  • outX:结果数组第一维长度
  • outY:结果数组第二维长度
  • 返回值:结果数组

代码

float* myDotf_2D_float(float* inArr1, int x1, int y1, float* inArr2, int x2, int y2, int *outX, int *outY) {

float* outArr = NULL;

if (y1 != x2) {
	printf("矩阵1和2的行列长度不合法\n");
	return NULL;
}
if (outX == NULL || outY == NULL) {
	printf("myDotf_2D_float:\noutX == NULL || outY == NULL\n");
	return NULL;
}
*outX = x1;
*outY = y2;
outArr = (float*)malloc(sizeof(float) * (*outX) * (*outY));
if (outArr == NULL) {
	printf("myDotf_2D_float:\noutArr = NULL\n");
	return NULL;
}
memset(outArr,0, sizeof(float) * (*outX) * (*outY));

//计算
for (int i = 0; i < x1; i++) {
	for (int j = 0; j < y2; j++) {
		for (int k = 0;k< y1; k++) {
			outArr[getIndexOfArr_2d(*outX, *outY, i, j)] += inArr1[getIndexOfArr_2d(x1, y1, i, k)] * inArr2[getIndexOfArr_2d(x2, y2, k, j)];
			//outArr[i][j] += inArr1[j][k]*inArr2[k][j];
		}
	}
}
return outArr;

}

参数说明

  • inArr1:输入数组1
  • xLen:数组1第一维长度
  • yLen:数组1第二维长度
  • inArr2:输入数组2
  • len:数组2长度
  • outLen:结果数组维长度
  • 返回值:结果数组

代码

float* myDot_2Dx1D_float(float* inArr1, int xLen, int yLen, float* inArr2, int len, int* outLen) {

int i = 0, j = 0;
float* returnList = NULL;//一维数组
float tmp = 0.0f;

if (inArr1 == NULL || inArr2 == NULL) {
	printf("myDot_2Dx1D_float:\ninArr1 == NULL || inArr2 == NULL\n");
	return NULL;
}
if (yLen != len) {
	printf("myDot_2Dx1D_float:\n输入数组长度非法,yLen != len\n");
	return NULL;
}
if (outLen == NULL) {
	printf("myDot_2Dx1D_float:\noutLen = NULL\n");
	return NULL;
}
*outLen = xLen;
returnList = (float*)malloc(sizeof(float) * xLen);
if (returnList == NULL) {
	printf("malloc失败\n");
	return NULL;
}

memset(returnList, 0, sizeof(float) * xLen);
for (i = 0; i < xLen; i++) {
	for (j = 0; j < len; j++) {
		tmp = inArr1[getIndexOfArr_2d(xLen, yLen, i, j)] * inArr2[j];
		returnList[i] += tmp;
	}
}

return returnList;

}

参数说明

  • inArr1:输入数组1
  • inArr2:输入数组2
  • len:输入数组长度
  • 返回值:结果

代码

float myDot_1Dx1D_float(float* inArr1, float* inArr2, int len) {

//假定输入数组长度匹配
float returnValue = 0.0f;
int i = 0;

if (inArr1 == NULL || inArr2 == NULL) {
	printf("myDot_1Dx1D_float:\ninArr1 == NULL || inArr2 == NULL\n");
	return -1.0f;
}
for (i = 0;i<len;i++) {
	returnValue += inArr1[i] * inArr2[i];
}
return returnValue;

}