代码之家  ›  专栏  ›  技术社区  ›  Moe El

从2D阵列到C中的2x2矩阵

  •  1
  • Moe El  · 技术社区  · 1 年前

    我正试图从两个包含C中值的2D数组中创建一个2x2矩阵。要生成的矩阵名为重叠,是一个2x2矩阵,其元素是每个D和a数组的函数。 我已经编写了以下代码,其输出如下所示。 我不知道我做错了什么,我想知道读到这篇文章的人是否能帮助一个误入歧途的新C学习者。 附言:我知道我可以显式地写入每个元素,然后将它们放入矩阵中,而无需使用数组;然而,我计划使用这个骨架作为自动化挖掘代码的基础,以获得更大的输入。

    #include <math.h>
    #include <stdio.h>
    #include <stdlib.h>
    #define BASISFUN 2
    #define PI 3.14159265358979323846
    void overlaps(double overlap[][2], double d[][2], double a[][2]) {
      printf("\nThe Overlap Matrix is\n");
      for (int i = 0; i < BASISFUN; i++) {
        for (int j = 0; j < BASISFUN; j++) {
          overlap[i][j] = 0.0;
          if (i == j && i == 0) {
            overlap[0][0] =
                pow(d[0][0], 2.0) * pow((PI / (a[0][0] + a[0][0])), 1.5);
          } else if (i == j && i == 1) {
            overlap[1][1] =
                pow(d[1][1], 2.0) * pow((PI / (a[1][1] + a[1][1])), 1.5);
          } else if (i != j && i == 1) {
            overlap[1][0] =
                pow(d[1][0], 2.0) * pow((PI / (a[1][0] + a[1][0])), 1.5);
          } else {
            overlap[0][1] =
                pow(d[0][1], 2.0) * pow((PI / (a[0][1] + a[0][1])), 1.5);
          }
          printf("%.4f\t", overlap[i][j]);
        }
        printf("\n");
      }
    }
    int main() {
      double A1 = 0.532149;
      double A2 = 4.097728;
      double D1 = 0.82559;
      double D2 = 0.28317;
      double a[1][2] = {A1, A2};
      double d[1][2] = {D1, D2};
      double overlap[2][2];
      overlaps(overlap, d, a);
      return 0;
    }
    

    输出: 轨道系数矩阵为

    3.4567  0.0190  
    3.6998  44.0676 
    

    然而,当使用Matlab时,产品应如下所示,这是100%正确的:

    3.4567    0.1307
    0.1307    0.0190
    
    1 回复  |  直到 1 年前
        1
  •  2
  •   user24714692    1 年前

    这个 a d 的尺寸和计算 overlap 不正确:

    #include <math.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    #define BASISFUN 2
    #define PI 3.14159265358979323846
    
    void overlaps(double overlap[][BASISFUN], double d[][BASISFUN], double a[][BASISFUN])
    {
        overlap[0][0] = pow(d[0][0], 2.0) * pow((PI / (a[0][0] + a[0][0])), 1.5);
        overlap[0][1] = d[0][0] * d[0][1] * pow((PI / (a[0][0] + a[0][1])), 1.5);
        overlap[1][0] = d[1][0] * d[1][1] * pow((PI / (a[1][0] + a[1][1])), 1.5);
        overlap[1][1] = pow(d[1][1], 2.0) * pow((PI / (a[1][1] + a[1][1])), 1.5);
    
        printf("The Overlap Matrix is:\n");
        for (int i = 0; i < BASISFUN; i++)
        {
            for (int j = 0; j < BASISFUN; j++)
            {
                printf("%.8f\t", overlap[i][j]);
            }
            printf("\n");
        }
    }
    
    int main()
    {
        double A1 = 0.532149, A2 = 4.097728, D1 = 0.82559, D2 = 0.28317;
    
        double a[BASISFUN][BASISFUN] = {{A1, A2}, {A1, A2}};
        double d[BASISFUN][BASISFUN] = {{D1, D2}, {D1, D2}};
    
        double overlap[BASISFUN][BASISFUN];
        overlaps(overlap, d, a);
    
        return 0;
    }
    
    
    

    打印

    The Overlap Matrix is:
    3.45667690  0.13067193  
    0.13067193  0.01903091  
    

    评论

    • 为了提高一致性 2 BASISFUN 建议在几个(也许所有)地方。chux-恢复Monica

    • 您也可以使用 long double ,如果需要,并根据的正确计算重写循环 重叠 .


    编辑

    只需为其指定适当的值,就可以将其进一步扩展到更高的维度 A[BASISFUN] D[BASISFUN] 并相应地修改循环:

    #include <math.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    #define BASISFUN 6
    #define PI 3.14159265358979323846
    
    void overlaps(
        double overlap[][BASISFUN],
        double d[][BASISFUN],
        double a[][BASISFUN])
    {
    
        for (int i = 0; i < BASISFUN; i++)
        {
            overlap[i][i] = pow(d[i][i], 2.0) * pow((PI / (a[i][i] + a[i][i])), 1.5);
        }
    
        for (int i = 0; i < BASISFUN; i++)
        {
            for (int j = 0; j < BASISFUN; j++)
            {
                if (i != j)
                {
                    overlap[i][j] =
                        d[i][j] * d[j][i] * pow((PI / (a[i][j] + a[j][i])), 1.5);
                }
            }
        }
    
        printf("The Overlap Matrix is:\n");
        for (int i = 0; i < BASISFUN; i++)
        {
            for (int j = 0; j < BASISFUN; j++)
            {
                printf("%.8f\t", overlap[i][j]);
            }
            printf("\n");
        }
    }
    
    int main()
    {
        double a[BASISFUN][BASISFUN];
        double d[BASISFUN][BASISFUN];
    
        double A[BASISFUN] = {0.532149, 4.097728, 0.00001, 0.00001, 0.00001, 0.00001};
        double D[BASISFUN] = {0.82559, 0.28317, 0.00001, 0.00001, 0.00001, 0.00001};
    
        for (int i = 0; i < BASISFUN; i++)
        {
            for (int j = 0; j < BASISFUN; j++)
            {
                a[i][j] = A[j];
                d[i][j] = D[j];
            }
        }
    
        double overlap[BASISFUN][BASISFUN];
        overlaps(overlap, d, a);
    
        return 0;
    }
    
    

    打印

    The Overlap Matrix is:
    3.45667690  0.13067193  0.00011842  0.00011842  0.00011842  0.00011842  
    0.13067193  0.01903091  0.00000190  0.00000190  0.00000190  0.00000190  
    0.00011842  0.00000190  0.00622558  0.00622558  0.00622558  0.00622558  
    0.00011842  0.00000190  0.00622558  0.00622558  0.00622558  0.00622558  
    0.00011842  0.00000190  0.00622558  0.00622558  0.00622558  0.00622558  
    0.00011842  0.00000190  0.00622558  0.00622558  0.00622558  0.00622558