标题:写了一段计算行列式的代码,运行慢。大家有什么优化建议。
只看楼主
沈和
Rank: 2
等 级:论坛游民
威 望:5
帖 子:22
专家分:81
注 册:2019-8-26
 问题点数:0 回复次数:1 
写了一段计算行列式的代码,运行慢。大家有什么优化建议。
计算行列式的一段程序。程序主体部分在det.c中。1.c中:unsigned n = 12;
n取11以及以下时,运行时间挺短的。n取12时,运行时间是1分钟。n取13时,要12分钟。
det.h
程序代码:
#ifndef DET_H
#define DET_H

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
double det(double *matrix, unsigned size_n);
#endif

det.c
程序代码:
#include "det.h"

double det(double *matrix, unsigned size_n) {
  if (size_n == 1)
    return *matrix;
  else {
    double sum = 0.0;
    double *slice = malloc(sizeof(double) * pow(size_n - 1, 2));
    for (int i = 0; i < size_n; ++i) {
      int cnt = 0;
      for (int j = 1; j < size_n; ++j) {
        for (int k = 0; k < size_n; ++k) {
          if (i != k) {
            slice[cnt++] = matrix[j * size_n + k];
          }
        }
      }
      sum += pow(-1, i) * det(slice, size_n - 1) * matrix[i];
    }
    free(slice);
    return sum;
  }
}

1.c
程序代码:
#include "det.h"
#include <stdio.h>

int main(void) {
  double a[1] = {1};
  printf("%lf\n", det(a, 1));
  double b[4] = {1, 2, 3, 4};
  printf("%lf\n", det(b, 2));
  double c[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
  printf("%lf\n", det(c, 3));
  unsigned n = 12;
  double *d = malloc(sizeof(double) * pow(n, 2));
  srand(0);
  for (int i = 0; i < pow(n, 2); ++i) {
    d[i] = 0.03*(rand() % 51 + 19);
  }
  printf("%lf\n", det(d, n));
//  getchar();
  return 0;
}
搜索更多相关主题的帖子: int double matrix include 运行 
2020-09-05 17:07
沈和
Rank: 2
等 级:论坛游民
威 望:5
帖 子:22
专家分:81
注 册:2019-8-26
得分:0 
在站内找到了运行更快的。是把矩阵先化成上三角形式,再进行求值的。
https://bbs.bccn.net/thread-292421-1-1.html


程序代码:
#include "stdio.h"
#include <math.h>
#include <stdlib.h>
int main(void) { 
  int size_n = 7;
  double matrix[size_n][size_n];
  srand(0);
  for (int i = 0; i < size_n; ++i)
    for (int j = 0; j < size_n; ++j) {
      matrix[i][j] = 0.03 * (rand() % 51 + 19);
    }
  double r2z;
  int i, j, z;
  for (i = 0; i < size_n - 1; i++) {
    for (j = i; j < size_n - 1; j++) {
      if (matrix[i][i] == 0)
        for (j = i; matrix[i][i] == 0; j++) {
          for (z = 0; z < size_n; z++)
              matrix[i][z] = matrix[i][z] + matrix[j + 1][z];
          if (matrix[i][i] != 0)
            break;
        }
      r2z = -matrix[j + 1][i] / matrix[i][i];
      for (z = i; z < size_n; z++)
        matrix[j + 1][z] = r2z * (matrix[i][z]) + matrix[j + 1][z];
    }
  }
  double res = 1.0;
  for (i = 0; i < size_n; i++)
    res = res * (matrix[i][i]);
  for (int m = 0; m < size_n; ++m)
  {
    for (int n=0; n< size_n;++n)
    {
      printf("%4.1lf,", matrix[m][n]);
    }
    printf("\n");
  }
  printf("%lf\n", res);
}


[此贴子已经被作者于2020-9-5 18:14编辑过]

2020-09-05 17:10



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-503078-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012435 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved