函数功能
计算矩阵点乘
暂时包含的矩阵类型:
- 2维矩阵x2维矩阵
- 2维矩阵x1维矩阵
- 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;
}