在c

时间:2018-09-28 13:51:16

标签: c math matrix exponent

试图提高p的幂的矩阵,但我没有发现错误。谁能帮助和解释问题?我刚刚开始使用C编程,因此非常感谢您的帮助。用户应输入一个矩阵并将其提高到p的幂。

int main() {
    int n, p;
    printf("Number of Rows/Colums of square matrix: ");
    scanf("%d", &n);
    printf("to the power of: ");
    scanf("%d", &p);
    int m[n][n];
    int r[n][n];

    printf("Elements\n");
    for (int b = 0; b < n; b++) {
        for (int d = 0; d < n; d++) {
            printf("[%d][%d] = ", b + 1, d + 1);
            scanf("%d", &m[b][d]);
        }
    }

    int sum = 0;
    for (int i = 0; i < p; i++) {
        for (int b = 0; b < n; b++) {
            for (int d = 0; d < n; d++) {
                for (int k = 0; k < n; k++) {
                    sum += m[b][k] * m[k][d];
                }
                r[b][d] = sum;
                sum = 1;
            }
        }

        for (int b = 0; b < n; b++) {
            for (int d = 0; d < n; d++) {
                m[b][d] = r[b][d];
                r[b][d] = 0;
            }
        }
    }

    printf("RESULT:-\n");

    for (int c = 0; c < n; c++) {
        for (int d = 0; d < n; d++) {
            printf("%d   ", m[c][d]);
        }
        printf("\n");
    }

    getch();
    return 0;
}

4 个答案:

答案 0 :(得分:2)

您的程序逻辑在多个层次上都是错误的。

这是您更正的程序。仍有改进的空间(将代码分解为功能,使用更好的变量命名,使用比残酷矩阵乘法更有效的算法,正确处理p为0的情况),但我尝试尽可能地坚持原始的错误实现。

这是一种方法:我们有三个矩阵:r结果,m用户提供的矩阵和temp临时矩阵。

  1. 最初,我们将m复制到r,这是p = 1的结果
  2. 我们重复步骤3和4 p - 1
  3. 我们将rm相乘并将结果放入temp
  4. 我们将temp复制到r
  5. 现在r包含提升到m幂的p

#include <stdio.h>

int main() {
  int n, p;
  printf("Numer of Rows/Colums of sq matrix: ");
  scanf("%d", &n);
  printf("to the power of: ");
  scanf("%d", &p);
  int m[n][n];
  int r[n][n];
  int temp[n][n];

  printf("Elements\n");
  for (int b = 0; b < n; b++) {
    for (int d = 0; d < n; d++) {
      printf("[%d][%d] = ", b + 1, d + 1);
      scanf("%d", &m[b][d]);
    }
  }

  // r = m
  // temp = m
  for (int b = 0; b < n; b++) {
    for (int d = 0; d < n; d++) {
      r[b][d]   = m[b][d];
    }
  }

  for (int i = 0; i < p - 1; i++)  // p - 1 because for p = 1, r already 
  {                                // contains the result
    int sum = 0;

    // temp = r * m
    for (int b = 0; b < n; b++)
    {
      for (int d = 0; d < n; d++)
      {
        for (int k = 0; k < n; k++)
        {
          sum += m[b][k] * r[k][d];
        }
        temp[b][d] = sum;
        sum = 0;
      }
    }

    // r = temp
    for (int b = 0; b < n; b++) {
      for (int d = 0; d < n; d++) {
        r[b][d] = temp[b][d];
      }
    }
  }

  printf("RESULT:\n");

  for (int c = 0; c < n; c++)
  {
    for (int d = 0; d < n; d++)
    {
      printf("%d   ", r[c][d]);
    }
    printf("\n");
  }

  return 0;
}

答案 1 :(得分:2)

我认为您的代码中存在各种逻辑问题。

外循环是错误的,因为您的循环量要少一倍。

第二,您需要一个编写代码的缓冲矩阵。

另一个问题是,当您将行/列值相乘时,始终使用原始矩阵。这在逻辑上是错误的,您需要将计算出的当前功率乘以原始矩阵。

我也不明白为什么将sum变量重置为1而不是0。

类似的事情应该起作用:

#include <stdio.h>

int main() {
int n, p;
printf("Numer of Rows/Colums of sq matrix: ");
scanf("%d", &n);
printf("to the power of: ");
scanf("%d", &p);
int m[n][n];
int r[n][n];
int tmp[n][n];

printf("Elements\n");
for ( int b = 0 ; b < n ; b++ ) {
    for ( int d = 0 ; d < n ; d++ ) {
        printf("[%d][%d] = ", b+1, d+1);
        scanf("%d", &m[b][d]);
        r[b][d] = m[b][d];
    }
}

int sum = 0;
//you loop 1 time less of the power
for (int i = 0; i < p - 1; i++)
{
    for ( int b = 0 ; b < n ; b++ )
    {
        for (int d = 0 ; d < n ; d++ )
        {
            for (int k = 0 ; k < n ; k++ )
            {
                sum += r[b][k]*m[k][d];
            }
            tmp[b][d] = sum;
            sum = 0;
        }
    }

    for ( int b = 0 ; b < n ; b++ ) {
        for ( int d = 0 ; d < n ; d++ ) {
            //m[b][d] = r[b][d];
            r[b][d] = tmp[b][d];
        }
    }
}

printf("RESULT:-\n");

for (int c = 0 ; c < n ; c++ )
{
    for (int d = 0 ; d < n ; d++ )
    {
        printf("%d   ", r[c][d]);
    }
    printf("\n");
}

getchar();
return 0;
}

我只是指出,此解决方案可能不适用于p <1

答案 2 :(得分:2)

我建议您将这个复杂的问题分解为较小的问题。

创建较小的函数,对其进行测试以确保它们正常工作,然后下一步调用这些函数,直到获得完整的函数为止。

您需要以一个矩阵开始:a[m][n]。它保存的值应该是整数,浮点数还是双精度数?确保可以创建不同大小的矩阵。您对行和列的限制应该是什么?

从读取和写入矩阵的方法开始。

接下来是将多个两个矩阵放在一起的方法:c[m][n] = a[m][k]*b[k][n]a中的列数与b中的行数匹配,或者您不能相乘。

将矩阵提高到整数幂p > 1意味着将起始矩阵自身乘以p倍。您能看到一个要求是起始矩阵必须为正方形吗? (#行==#列)如果不正确,则不能提高为整数幂。

您将需要一个循环来提高p次幂。每次循环时,您将调用矩阵乘法方法c = mult(a, b)。每次传递都会获取上一个调用的输出,并将其作为调用中的第一个矩阵:c = mult(c, b)

如果您以此方式攻击问题,则应该能够解决它。在继续之前,请务必仔细测试每个步骤。

这称为分解。这是解决一般问题,尤其是计算机科学问题的基石。

答案 3 :(得分:1)

您的代码中存在多个问题:

  • 您应该使用临时矩阵t计算r * m的结果,然后在下一步之前将其复制到r
  • sum应该重新初始化为0,或者最好在0循环之前初始化为k

这是更正的版本:

#include <stdio.h>

int main() {
    int n, p;
    printf("Number of Rows/Colums of square matrix: ");
    if (scanf("%d", &n) != 1 || n <= 0)
        return 1;
    printf("to the power of: ");
    if (scanf("%d", &p) != 1 || p < 0)
        return 1;

    int m[n][n];
    int r[n][n];
    int t[n][n];

    printf("Elements\n");
    for (int b = 0; b < n; b++) {
        for (int d = 0; d < n; d++) {
            printf("[%d][%d] = ", b + 1, d + 1);
            if (scanf("%d", &m[b][d]) != 1)
                return 1;
            r[b][d] = b == d; // initialize r to identity matrix
        }
    }
    for (int i = 0; i < p; i++) {
        for (int b = 0; b < n; b++) {
            for (int d = 0; d < n; d++) {
                int sum = 0;
                for (int k = 0; k < n; k++) {
                    sum += r[b][k] * m[k][d];
                }
                t[b][d] = sum;
            }
        }
        for (int b = 0; b < n; b++) {
            for (int d = 0; d < n; d++) {
                r[b][d] = t[b][d];
            }
        }
    }

    printf("RESULT:\n");
    for (int c = 0; c < n; c++) {
        for (int d = 0; d < n; d++) {
            printf("%3d ", r[c][d]);
        }
        printf("\n");
    }
    return 0;
}

注意:

  • 上面的代码适用于正幂,包括0会产生单位矩阵。

  • 但是请注意,此方法对于大功率而言效率低下,int可能对于大功率而言仍然会溢出。