【问题标题】:Why does my C program that is supposed to output a matrix to the power of n output my matrix to the power of 2^n?为什么我的 C 程序应该输出一个 n 次方的矩阵,却输出我的矩阵的 2^n 次方?
【发布时间】:2018-10-14 12:17:37
【问题描述】:

我的代码应该采用矩阵 M 并将其提升到整数 A 的幂。但是,不知何故,我的输出始终是 M^(2^A)。例如,如果我想找到一个矩阵的 3 次方,我将得到它的 8 次方。

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h>
  void multiply(int ** p, int pwr, int dim, int ** prod) {
    int m, i, j, k;
    /*if (n<pwr){*/
    int pos = 0;
    for (m = 0; m < pwr; m++) {
      for (i = 0; i < dim; i++) {
        for (j = 0; j < dim; j++) {
          for (k = 0; k < dim; k++) {
            pos += p[i][k] * p[k][j];
          }
          prod[i][j] = pos;
          pos = 0;
        }
      }
      for (i = 0; i < dim; i++) {
        for (j = 0; j < dim; j++) {
          p[i][j] = prod[i][j];
          prod[i][j] = 0;
        }
      }
    }
    /*n=n+1;
    multiply(prod, q, pwr, dim, prod);
    }*/
  }
int main(int argc, char * argv[]) {
  FILE * fp = fopen(argv[1], "r");
  int dim, pwr, i, j;
  fscanf(fp, "%d", & dim);
  int ** matrix;
  matrix = (int ** ) malloc(dim * sizeof(int * ));
  for (i = 0; i < dim; i++) {
    matrix[i] = (int * ) malloc(dim * sizeof(int));
  }
  int ** prod;
  prod = (int ** ) malloc(dim * sizeof(int * ));
  for (i = 0; i < dim; i++) {
    prod[i] = (int * ) malloc(dim * sizeof(int));
  }
  for (i = 0; i < dim; i++) {
    for (j = 0; j < dim; j++) {
      fscanf(fp, "%d", & matrix[i][j]);
    }
  }
  fscanf(fp, "%d", & pwr);
  if (pwr == 1) {
    for (i = 0; i < dim; i++) {
      for (j = 0; j < dim; j++) {
        printf("%d ", matrix[i][j]);
      }
      printf("\n");
    }
  } else if (pwr >= 2) {
    multiply(matrix, pwr, dim, prod);
    for (i = 0; i < dim; i++) {
      for (j = 0; j < dim; j++) {
        printf("%d ", matrix[i][j]);
      }
      printf("\n");
    }
  }
  return 0;
}

【问题讨论】:

  • 要调试这个(对于初学者),编写一些打印语句并找出流程中发生的事情 - 程序如何进行 + 正确缩进。

标签: c linux unix matrix matrix-multiplication


【解决方案1】:

您将矩阵自身相乘,然后将结果存储在原始矩阵中。然后你再做一次。

非常正常,它会通电 8 次。您需要的是另一个临时矩阵,您可以在其上存储结果并保留原始矩阵以与结果相乘。

【讨论】:

  • 我创建了一个临时矩阵,在 for 循环开始之前将其设置为等于 p,并将所有内容存储在原始矩阵中。我还是有点迷茫
  • p 是您的原始矩阵。在您的第一次迭代之后,在p 中的pis not p, but p**2. And so on. You can see that your are copying prod` 中,不是吗?
猜你喜欢
  • 1970-01-01
  • 2019-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多