Как заставить программу увидеть новую матрицу, которую я создал? - PullRequest
0 голосов
/ 21 января 2019

Я хочу реализовать умножение матриц с использованием метода Штрассена. Так как моя матрица ввода не будет 2^n *2^n все время, например, это может быть матрица 3 * 3, мне нужно заполнить область края 0. Но я столкнулся с проблемой, когда я создаю новую матрицу A_new[][] для A[][], B_new[][] для B[][]. Я могу успешно сгенерировать A_new[][] и B_new[][] как для квадрата (2 * 2 и т. Д.), Так и (3 * 3 и т. Д.). Но когда я захочу в дальнейшем использовать 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;
      }
    }
  }

1 Ответ

0 голосов
/ 21 января 2019

если вы переместитесь на int A_new[N + 1][N + 1]; и int B_new[N + 1][N + 1]; перед тем, если вы сможете без проблем использовать A и B в двух ветвях , если ,и они доступны после , если тоже, конечно.Вы не используете все ячейки в ветви 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 если 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;
      }
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...