馬上交實驗報告了,各位大佬撈我一下
#pragma once
void strassen_upgraded(int n, int** matrix1, int** matrix2, int** matrix_result)
{
if (n <= 1)
{
MUL(matrix1, matrix2, matrix_result, n);
}
else
{
int size = 0;
int** matrix_A = NULL;
int** matrix_B = NULL;
int** matrix_RESULT = NULL;
if (n % 2 != 0)
{
size = (n + 1) / 2;
matrix_A = (int**)realloc(matrix1, (n + 1) * sizeof(int*));
matrix_B = (int**)realloc(matrix2, (n + 1) * sizeof(int*));
matrix_RESULT = (int**)realloc(matrix_result, (n + 1) * sizeof(int*));
matrix_A[n] = (int*)calloc(n + 1, sizeof(int));
matrix_B[n] = (int*)calloc(n + 1, sizeof(int));
matrix_RESULT[n] = (int*)calloc(n + 1, sizeof(int));
for (int i = 0; i < n + 1; i++)
{
matrix_A[i][n] = 0;
matrix_B[i][n] = 0;
matrix_RESULT[i][n] = 0;
}
}
else
{
size = n / 2;
matrix_A = (int**)malloc(n * sizeof(int*));
for (int i = 0; i < n; i++)
{
matrix_A[i] = (int*)calloc(n, sizeof(int));
}
matrix_B = (int**)malloc(n * sizeof(int*));
for (int i = 0; i < n; i++)
{
matrix_B[i] = (int*)calloc(n, sizeof(int));
}
matrix_RESULT = (int**)malloc(n * sizeof(int*));
for (int i = 0; i < n; i++)
{
matrix_RESULT[i] = (int*)calloc(n, sizeof(int));
}
memmove(matrix_A, matrix1, sizeof(matrix1));
memmove(matrix_B, matrix2, sizeof(matrix2));
memmove(matrix_RESULT, matrix_result, sizeof(matrix_result));
}
//定義矩陣并分配空間
int** A11 = NULL;
A11 = (int**)malloc(size * sizeof(int*));
for (int i = 0; i < size; i++)
{
A11[i] = (int*)calloc(size, sizeof(int));
}
int** A12 = NULL;
A12 = (int**)malloc(size * sizeof(int*));
for (int i = 0; i < size; i++)
{
A12[i] = (int*)calloc(size, sizeof(int));
}
int** A21 = NULL;
A21 = (int**)malloc(size * sizeof(int*));
for (int i = 0; i < size; i++)
{
A21[i] = (int*)calloc(size, sizeof(int));
}
int** A22 = NULL;
A22 = (int**)malloc(size * sizeof(int*));
for (int i = 0; i < size; i++)
{
A22[i] = (int*)calloc(size, sizeof(int));
}
int** B11 = NULL;
B11 = (int**)malloc(size * sizeof(int*));
for (int i = 0; i < size; i++)
{
B11[i] = (int*)calloc(size, sizeof(int));
}
int** B12 = NULL;
B12 = (int**)malloc(size * sizeof(int*));
for (int i = 0; i < size; i++)
{
B12[i] = (int*)calloc(size, sizeof(int));
}
int** B21 = NULL;
B21 = (int**)malloc(size * sizeof(int*));
for (int i = 0; i < size; i++)
{
B21[i] = (int*)calloc(size, sizeof(int));
}
int** B22 = NULL;
B22 = (int**)malloc(size * sizeof(int*));
for (int i = 0; i < size; i++)
{
B22[i] = (int*)calloc(size, sizeof(int));
}
int** P1 = NULL;
P1 = (int**)malloc(size * sizeof(int*));
for (int i = 0; i < size; i++)
{
P1[i] = (int*)calloc(size, sizeof(int));
}
int** P2 = NULL;
P2 = (int**)malloc(size * sizeof(int*));
for (int i = 0; i < size; i++)
{
P2[i] = (int*)calloc(size, sizeof(int));
}
int** P3 = NULL;
P3 = (int**)malloc(size * sizeof(int*));
for (int i = 0; i < size; i++)
{
P3[i] = (int*)calloc(size, sizeof(int));
}
int** P4 = NULL;
P4 = (int**)malloc(size * sizeof(int*));
for (int i = 0; i < size; i++)
{
P4[i] = (int*)calloc(size, sizeof(int));
}
int** P5 = NULL;
P5 = (int**)malloc(size * sizeof(int*));
for (int i = 0; i < size; i++)
{
P5[i] = (int*)calloc(size, sizeof(int));
}
int** P6 = NULL;
P6 = (int**)malloc(size * sizeof(int*));
for (int i = 0; i < size; i++)
{
P6[i] = (int*)calloc(size, sizeof(int));
}
int** P7 = NULL;
P7 = (int**)malloc(size * sizeof(int*));
for (int i = 0; i < size; i++)
{
P7[i] = (int*)calloc(size, sizeof(int));
}
int** C11 = NULL;
C11 = (int**)malloc(size * sizeof(int*));
for (int i = 0; i < size; i++)
{
C11[i] = (int*)calloc(size, sizeof(int));
}
int** C12 = NULL;
C12 = (int**)malloc(size * sizeof(int*));
for (int i = 0; i < size; i++)
{
C12[i] = (int*)calloc(size, sizeof(int));
}
int** C21 = NULL;
C21 = (int**)malloc(size * sizeof(int*));
for (int i = 0; i < size; i++)
{
C21[i] = (int*)calloc(size, sizeof(int));
}
int** C22 = NULL;
C22 = (int**)malloc(size * sizeof(int*));
for (int i = 0; i < size; i++)
{
C22[i] = (int*)calloc(size, sizeof(int));
}
int** result1 = NULL;
result1 = (int**)malloc(size * sizeof(int*));
for (int i = 0; i < size; i++)
{
result1[i] = (int*)calloc(size, sizeof(int));
}
int** result2 = NULL;
result2 = (int**)malloc(size * sizeof(int*));
for (int i = 0; i < size; i++)
{
result2[i] = (int*)calloc(size, sizeof(int));
}
//分塊
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
A11[i][j] = matrix_A[i][j];
A12[i][j] = matrix_A[i][j + size];
A21[i][j] = matrix_A[i + size][j];
A22[i][j] = matrix_A[i + size][j + size];
B11[i][j] = matrix_B[i][j];
B12[i][j] = matrix_B[i][j + size];
B21[i][j] = matrix_B[i + size][j];
B22[i][j] = matrix_B[i + size][j + size];
}
}
//演算法的具體步驟
ADD(A11, A22, result1, size);
ADD(B11, B22, result2, size);
strassen_upgraded(size, result1, result2, P1);
ADD(A21, A22, result1, size);
strassen_upgraded(size, result1, B11, P2);
SUB(B12, B22, result1, size);
strassen_upgraded(size, A11, result1, P3);
SUB(B21, B11, result1, size);
strassen_upgraded(size, A22, result1, P4);
ADD(A11, A12, result1, size);
strassen_upgraded(size, result1, B22, P5);
SUB(A21, A11, result1, size);
ADD(B11, B12, result2, size);
strassen_upgraded(size, result1, result2, P6);
SUB(A12, A22, result1, size);
ADD(B21, B22, result2, size);
strassen_upgraded(size, result1, result2, P7);
ADD(P1, P4, result1, size);
SUB(P7, P5, result2, size);
ADD(result1, result2, C11, size);
ADD(P3, P5, C12, size);
ADD(P2, P4, C21, size);
ADD(P1, P3, result1, size);
SUB(P6, P2, result2, size);
ADD(result1, result2, C22, size);
//填入新矩陣
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
matrix_RESULT[i][j] = C11[i][j];
matrix_RESULT[i][j + size] = C12[i][j];
matrix_RESULT[i + size][j] = C21[i][j];
matrix_RESULT[i + size][j + size] = C22[i][j];
}
}
for (int i = 0; i < size; i++)
{
free(A11[i]); free(A12[i]); free(A21[i]); free(A22[i]);
free(B11[i]); free(B12[i]); free(B21[i]); free(B22[i]);
free(P1[i]); free(P2[i]); free(P3[i]); free(P4[i]); free(P5[i]); free(P6[i]); free(P7[i]);
free(C11[i]); free(C12[i]); free(C21[i]); free(C22[i]);
free(result1[i]); free(result2[i]);
}
for (int i = 0; i < 2 * size; i++)
{
free(matrix_A[i]); free(matrix_B[i]); free(matrix_RESULT[i]); //這一步報錯:觸發了一個斷點
}
free(A11); free(A12); free(A21); free(A22);
free(B11); free(B12); free(B21); free(B22);
free(P1); free(P2); free(P3); free(P4); free(P5); free(P6); free(P7);
free(C11); free(C12); free(C21); free(C22);
free(result1); free(result2);
free(matrix_A); free(matrix_B); free(matrix_RESULT);
}
}
uj5u.com熱心網友回復:
樓主是上海某985大二學渣,演算法課讓實作矩陣規模非2的冪次下的strassen演算法,搞來搞去好像都是記憶體方面的錯誤,煩請各位大佬幫我看看哪兒的問題uj5u.com熱心網友回復:
救救孩子!!!(撈一下寄幾)轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/160301.html
標籤:C語言
