【发布时间】:2019-01-22 05:11:44
【问题描述】:
我想用 Strassen 方法实现矩阵乘法。由于我的输入矩阵不会一直是2^n *2^n,例如,它可能是3*3矩阵,我需要用0填充边缘区域。但是当我为A_new[][]创建新矩阵时遇到了一个问题A[][],B_new[][] 为 B[][]。我可以为正方形(2*2 等)或(3*3 等)成功生成A_new[][] 和B_new[][]。但是当我想进一步使用之前创建的A_new[][]和B_new[][]时,“if”语句之外的代码就看不到了。
是否有一些方法可以让“if”语句之外的代码看到并处理它?
这是我的代码。
void strassen(int A[][N], int B[][N], int C[][N]) {
if (N == 1) {
C[0][0] = A[0][0] * B[0][0];
}
if (N > 1 && N % 2 != 0) {
int A_new[N + 1][N + 1];
int B_new[N + 1][N + 1];
int i, j;
for (i = 0; i < N + 1; i++) {
if (i == N) {
for (j = 0; j < N + 1; j++) {
A_new[i][j] = 0;
B_new[i][j] = 0;
}
} else {
for (j = 0; j < N + 1; j++) {
if (j == N) {
A_new[i][j] = 0;
B_new[i][j] = 0;
} else {
A_new[i][j] = A[i][j];
B_new[i][j] = B[i][j];
}
}
}
}
for (i = 0; i < N + 1; i++) {
for (j = 0; j < N + 1; j++) {
C[i][j] = 0;
}
}
} else {
int i, j;
int A_new[N][N];
int B_new[N][N];
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
A_new[i][j] = A[i][j];
}
}
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
B_new[i][j] = B[i][j];
}
}
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
C[i][j] = 0;
}
}
}
【问题讨论】:
-
将它们移出 if 范围并将其移至上层范围。如果(...){如果范围}。 vars 在声明它们的范围内是本地的。因此,如果您将它们的声明移到第一个 if 语句之前,它们将在所有函数范围内“活动”,而不仅仅是在 if 范围内
-
我不能因为在if语句之外,我不确定矩阵大小,如果它可以被2除,则大小为N,如果不能,则大小将是 N+1。
-
你可以定义指针,并使用malloc在堆上分配内存。
-
顺便说一句,你可以“腰部”记忆并让它们成为N+1。如果尺寸需要为 N,只需使用您的内垫即可。
-
我怀疑 1
} if (N > 1 && N % 2 != 0) {应该是} else if (N > 1 && N % 2 != 0) {。
标签: c