You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

73 lines
2.1 KiB

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct {
float* values;
int* rowIndex;
int* colIndex;
int nonZeroCount;
} SparseMatrix;
void sparse_matmul(SparseMatrix A, SparseMatrix B, SparseMatrix* C) {
int rowsA = A.rowIndex[A.nonZeroCount];
int colsA = A.colIndex[A.nonZeroCount];
int rowsB = B.rowIndex[B.nonZeroCount];
int colsB = B.colIndex[B.nonZeroCount];
if (colsA != rowsB) {
printf("ά<EFBFBD>Ȳ<EFBFBD>ƥ<EFBFBD><EFBFBD>޷<EFBFBD><EFBFBD><EFBFBD><EFBFBD>о<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˷<EFBFBD><EFBFBD><EFBFBD>\n");
return;
}
C->nonZeroCount = 0;
C->values = (float*)malloc(sizeof(float) * (rowsA * colsB));
C->rowIndex = (int*)malloc(sizeof(int) * (rowsA * colsB));
C->colIndex = (int*)malloc(sizeof(int) * (rowsA * colsB));
for (int i = 0; i < A.nonZeroCount; i++) {
for (int j = 0; j < B.nonZeroCount; j++) {
if (A.colIndex[i] == B.rowIndex[j]) {
float val = A.values[i] * B.values[j];
int row = A.rowIndex[i];
int col = B.colIndex[j];
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD>ڸ<EFBFBD>Ԫ<EFBFBD><D4AA>
int exists = 0;
for (int k = 0; k < C->nonZeroCount; k++) {
if (C->rowIndex[k] == row && C->colIndex[k] == col) {
C->values[k] += val;
exists = 1;
break;
}
}
if (!exists) {
C->values[C->nonZeroCount] = val;
C->rowIndex[C->nonZeroCount] = row;
C->colIndex[C->nonZeroCount] = col;
C->nonZeroCount++;
}
}
}
}
}
int main() {
// ʾ<><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϡ<EFBFBD><CFA1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><41>B<EFBFBD><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>sparse_matmul<75><6C><EFBFBD><EFBFBD>
// ע<><EFBFBD><E2A3BA><EFBFBD><EFBFBD>ʡ<EFBFBD><CAA1><EFBFBD><EFBFBD>ϡ<EFBFBD><CFA1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBA3AC><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
SparseMatrix A, B, C;
// <20><>ʼ<EFBFBD><CABC>A<EFBFBD><41>B...
clock_t start = clock();
sparse_matmul(A, B, &C);
clock_t end = clock();
printf("ϡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˷<EFBFBD><EFBFBD><EFBFBD>ʱ: %lf <20><><EFBFBD><EFBFBD>\n", 1000.0 * (end - start) / CLOCKS_PER_SEC);
// <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>...
return 0;
}