diff --git a/5.cpp b/5.cpp new file mode 100644 index 0000000..c1033ae --- /dev/null +++ b/5.cpp @@ -0,0 +1,74 @@ +#include +#include +#define SIZE 1024 + +void sparse_matmul_coo(float* A_values, int* A_rowIndex, int* A_colIndex, int A_nonZeroCount, + float* B_values, int* B_rowIndex, int* B_colIndex, int B_nonZeroCount, + float* C_values, int* C_rowIndex, int* C_colIndex, int *C_nonZeroCount) { + int currentIndex = 0; + // 遍历 A 的非零元素 + for (int i = 0; i < A_nonZeroCount; i++) { + int rowA = A_rowIndex[i]; + int colA = A_colIndex[i]; + float valueA = A_values[i]; + // 遍历 B 的非零元素 + for (int j = 0; j < B_nonZeroCount; j++) { + int rowB = B_rowIndex[j]; + int colB = B_colIndex[j]; + float valueB = B_values[j]; + // 如果 A 的列和 B 的行匹配,则计算乘积并存储结果 + if (colA == rowB) { + float product = valueA * valueB; + // 检查是否已有此 (rowA, colB) 项 + int found = 0; + for (int k = 0; k < currentIndex; k++) { + if (C_rowIndex[k] == rowA && C_colIndex[k] == colB) { + C_values[k] += product; + found = 1; + break; + } + } + // 如果没有此项,添加新的非零元素 + if (!found) { + C_values[currentIndex] = product; + C_rowIndex[currentIndex] = rowA; + C_colIndex[currentIndex] = colB; + currentIndex++; + } + } + } + } + // 更新非零元素数量 + *C_nonZeroCount = currentIndex; +} + +int main(){ + int i; + //矩阵 A 的 COO 格式 + float A_values[]={1,2,3,4,5}; + int A_rowIndex[]={0,0,1,2,2}; + int A_colIndex[]={0,2,1,0,2}; + int A_nonZeroCount=5; + + //矩阵 B 的 COO 格式 + float B_values[]={6,8,7,9}; + int B_rowIndex[]={0,2,1,2}; + int B_colIndex[]={0,0,1,2}; + int B_nonZeroCount=4; + + //矩阵 C 的 COO 格式 + float C_values[SIZE]; + int C_rowIndex[SIZE]; + int C_colIndex[SIZE]; + int C_nonZeroCount=0; + + //计时并输出 + clock_t start=clock(); + sparse_matmul_coo(A_values, A_rowIndex, A_colIndex, A_nonZeroCount, + B_values, B_rowIndex, B_colIndex, B_nonZeroCount, + C_values, C_rowIndex, C_colIndex, &C_nonZeroCount); + clock_t end=clock(); + printf("初始稀疏矩阵乘法时间:%f秒\n",(double)(end-start)/CLOCKS_PER_SEC); + + return 0; +}