C 如何让程序看到我创建的新矩阵?

C 如何让程序看到我创建的新矩阵?,c,C,我想用Strassen方法实现矩阵乘法。因为我的输入矩阵不会一直是2^n*2^n,例如,它可能是3*3矩阵,所以我需要用0填充边缘区域。但是当我为a[]][]创建新矩阵时,遇到了一个问题。我可以为正方形(2*2等)或正方形(3*3等)成功生成A_new[][]和B_new[][]。但是,当我想进一步使用我以前创建的A_new[][]和B_new[][][]时,“if”语句之外的代码看不到它 是否有一些方法可以让“if”语句之外的代码看到并处理它 这是我的密码 void strassen(int

我想用Strassen方法实现矩阵乘法。因为我的输入矩阵不会一直是
2^n*2^n
,例如,它可能是3*3矩阵,所以我需要用0填充边缘区域。但是当我为
a[]][]
创建新矩阵时,遇到了一个问题。我可以为正方形(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;
      }
    }
  }
void strassen(int A[][N]、int B[][N]、int C[][N]){
如果(N==1){
C[0][0]=A[0][0]*B[0][0];
}
如果(N>1&&N%2!=0){
INTA_新[N+1][N+1];
int B_new[N+1][N+1];
int i,j;
对于(i=0;i
如果将
int A_new[N+1][N+1];
int B_new[N+1][N+1];
移动到if之前,您可以毫无问题地在if的两个分支中使用A和B,当然在if之后也可以使用它们。您不使用else分支中的所有单元格,但这没有任何后果

  int A_new[N + 1][N + 1];
  int B_new[N + 1][N + 1];

  if (N > 1 && N % 2 != 0) {
    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;
    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;
      }
    }
  }
int A_new[N+1][N+1];
int B_new[N+1][N+1];
如果(N>1&&N%2!=0){
int i,j;
对于(i=0;i
正如chux在一条评论中所说的,您遗漏了一个else(或者如果N==1,您只需返回),代码可以是

  int A_new[N + 1][N + 1];
  int B_new[N + 1][N + 1];

  if (N == 1) {
    C[0][0] = A[0][0] * B[0][0];
  }
  else if (N > 1 && N % 2 != 0) {
    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;
    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;
      }
    }
  }
int A_new[N+1][N+1];
int B_new[N+1][N+1];
如果(N==1){
C[0][0]=A[0][0]*B[0][0];
}
否则如果(N>1&&N%2!=0){
int i,j;
对于(i=0;i
将它们移出if范围并将其移动到更高的范围。if(…){if scope}.vars是它们声明所在范围的本地变量。因此,如果将它们的声明移到第一个if语句之前,它们将处于“活动”状态对于所有的函数作用域,而不仅仅是if作用域,我不能确定矩阵的大小,因为在if语句之外,我不确定矩阵的大小,如果可以除以2,那么大小将是N,如果不能,那么大小将是N+1。您可以定义指针,并使用malloc在堆上分配内存。顺便说一下,您可以内存并使其为N+1。如果大小需要为N,则使用内部垫子。我怀疑1
}if(N>1&&N%2!=0){
应为
}否则if(N>1&&N%2!=0){
。我不能,因为在if语句之外,我不确定矩阵的大小,如果可以除以2,那么大小将是N,如果不能,那么大小将是N+1@SHANGZHOU虽然矩阵对于所有情况都足够大,但没有问题,只是一些单元格不会被使用,这一切都不会是问题