【问题标题】:Checking if an array is a diagonally dominant matrix in C检查数组是否是C中的对角占优矩阵
【发布时间】:2025-12-13 22:35:01
【问题描述】:

我在为我的研究编写任务时遇到问题 - 一种检查二维数组是否为对角占优矩阵的算法。

为此我做了一个函数:

      int dd_test(const int *ptr, int width, int height){

      if (width!=height)
        return -1;

      int sum=0;
      int j;

      for (int i=0;i<width;i++){
          for(j=0;j<height;j++){
            if(i!=j){
              if(*((ptr+i*width)+j)!=0)
                sum+=abs(*((ptr+i*width)+j));
              else
                continue;
            }
          }
          if(*((ptr+i*width)+j)<=sum)
            return 0;
          else if (*((ptr+i*width)+j)>sum)
            sum = 0;
      }
      return 1;
    }

首先它检查它是否是一个方阵,然后检查对角线上的数字是否是该行中最大的。如果不是,算法返回 0;如果是算法,则转到下一行并再次执行。 主函数如下所示:

    int main(void) {
  int wid=5, he=5;
  int matrix[5][5]={0};
  int *ma=matrix[0];

  puts("Input a 5x5 matrix: ");
  for(int i=0;i<5;i++){
      if(scanf("%d %d %d %d %d",(ma+i*wid),((ma+i*wid)+1),((ma+i*wid)+2),((ma+i*wid)+3),((ma+i*wid)+4))!=5){
        puts("Incorrect input");
        return 1;
      }
  }

  if(dd_test(ma, wid, he)==1)
    puts("YES");
  else if (dd_test(ma, wid,he)==0)
    puts("NO");

  return 0;
}

问题是它总是返回0。我找不到错误,请帮助我。我真的感觉筋疲力尽了。

谢谢。

【问题讨论】:

    标签: c pointers multidimensional-array diagonal


    【解决方案1】:

    我对你的 dd_test 做了一点修改。您正确地累积了每一行的非对角线分量,但您最终要求对角线分量的值错误。

    当您询问*((ptr+i*width)+j) 时,j 将等于身高。相反,您应该使用i,因为当前行的高度也等于该行的对角线分量的位置。

    int dd_test(const int* ptr, int width, int height) {
        if (width != height)
            return -1;
    
        int sum = 0;
    
        for (int i = 0; i < height; i++) {
            for (int j = 0; j < width; j++) {
                if (i != j) {
                    sum += abs(*((ptr + i * width) + j));
                }
            }
            if (*((ptr + i * width) + i) <= sum)
                return 0;
            else if (*((ptr + i * width) + i) > sum)
                sum = 0;
        }
        return 1;
    }
    

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      您应该使用ptr[i*width+j] 而不是*((ptr+i*width)+j),因为这样更容易阅读您的代码。

      你的情况不准确:

                if(*((ptr+i*width)+j)<=sum)
                  return 0;
                else if (*((ptr+i*width)+j)>sum)
                  sum = 0;
      

      应该改为:

               if(ptr[i*width+i]< sum) // it's similar to if(*((ptr+i*width)+i)< sum)
                  return 0;
               else 
                  sum = 0;
      

      您可以通过删除for 循环中的if else 条件来缩短代码:

      int dd_test(const int *ptr, int width, int height){
      
          if (width!=height)
              return -1;
          int j, sum = 0;
      
          for (int i=0;i<width;i++) {
              sum = 0;
              for(j=0;j<height;j++)
                  sum += abs(ptr[i*width+j]);
              sum -= abs(ptr[i*width+i]);
      
              if(ptr[i*width+i] < sum)
                  return 0;
          }
           return 1;
      }
      
      

      【讨论】: