【问题标题】:How to make the program see the new matrix I created?如何让程序看到我创建的新矩阵?
【发布时间】: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 &gt; 1 &amp;&amp; N % 2 != 0) { 应该是 } else if (N &gt; 1 &amp;&amp; N % 2 != 0) {

标签: c


【解决方案1】:

如果将int A_new[N + 1][N + 1];int B_new[N + 1][N + 1];移到if之前,可以在if的两个分支中使用AB没有问题,它们当然也可以在 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;
      }
    }
  }

正如 chux 在评论中所说,你错过了一个 else(或者你只是 return if 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;
      }
    }
  }

【讨论】:

  • 我不能因为在if语句之外,我不确定矩阵大小,如果它可以被2除,则大小为N,如果不能,则大小将是 N+1
  • @SHANGZHOU 虽然矩阵足够大,但对于所有情况都没有问题,只是有些单元格不会被使用,所有这些都不是问题
猜你喜欢
  • 2013-12-16
  • 1970-01-01
  • 2012-10-03
  • 2020-01-29
  • 1970-01-01
  • 2018-05-05
  • 2018-02-07
  • 2021-03-31
  • 1970-01-01
相关资源
最近更新 更多