c - 如何解决警告 'double *' 与 'double (*)[4][4]' 的间接级别不同

标签 c pointers matrix

我正在尝试使用下载的 tqli 算法计算矩阵的特征值。作为一个简单的例子,我试图测试它的 4x4 单位矩阵:

double ze[4][4];
double *zepointer;
ze[0][0] = 1;
ze[1][1] = 1;
ze[2][2] = 1;
ze[3][3] = 1;

ze[0][1] = 0;
ze[1][0] = 0;
ze[0][2] = 0;
ze[2][0] = 0;

ze[0][3] = 0;
ze[3][0] = 0;
ze[1][2] = 0;
ze[2][1] = 0;

ze[1][3] = 0;
ze[3][1] = 0;
ze[2][3] = 0;
ze[3][2] = 0;

zepointer = &ze;

tqli(de,ee,4,zepointer);

此外,希望有一种更智能的方法来生成单位矩阵,我的编译器向我发出警告,指出“double ”与“double ()[4][4]”的间接级别不同对于“zepointer = &ze;”行。我看了this question那里说警告来自声明之前的引用。但是我看不到我在代码片段中做到了这一点。

TQLI 是一种计算特征值和特征向量的算法。我是从here下载的.

最佳答案

I am trying to calculate eigenvalues of a matrix using a downloaded tqli algorithm

无法通过尝试转换 double[4][4] 来获取 double** 指针。

您必须使用不同的方法来为 tqli 函数提供所需的双 ** 指针。

您可以使用以下方法之一传递数据。

第一种方法:

1) 为指向 double **aa 的指针分配内存,并使用指向 a 数组中的行 vector 的指针来初始化它们。

第二种方法:

2) 为指向矩阵行的指针分配内存(如上所述)。为行的内容分配内存。复制 ze 中的所有元素值。

测试程序:

#include <stdlib.h>
#include <stdio.h>

#define M_SIZE  4  // size of the nxn matrix

void tqli(double d[], double e[], int n, double **z)
{
    int i,j;

    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
        {
             double d = z[i][j]; 
             printf(" z[%i][%i] = %f \n", i, j, d );
        }
        printf("\n"); 
    }
}

int main()
{
    int i,j;

    double ze[M_SIZE][M_SIZE];
    double **zepointer;

    ze[0][0] = 1;
    ze[1][1] = 1;
    ze[2][2] = 1;
    ze[3][3] = 1;

    ze[0][1] = 0;
    ze[1][0] = 0;
    ze[0][2] = 0;
    ze[2][0] = 0;

    ze[0][3] = 0;
    ze[3][0] = 0;
    ze[1][2] = 0;
    ze[2][1] = 0;

    ze[1][3] = 0;
    ze[3][1] = 0;
    ze[2][3] = 0;
    ze[3][2] = 0;

    double de[M_SIZE] = {0};
    double ee[M_SIZE] = {0};

   // 1.---------------------

    printf(" First array is { {6,7,8,9}, {1,6,1,5}, {6,2,2,4}, {1,2,3,4} } \n"); 

    double a[M_SIZE][M_SIZE]={ {6,7,8,9}, {1,6,1,5}, {6,2,2,4}, {1,2,3,4} };

    double **aa = malloc( M_SIZE * sizeof(double*)); // allocate memory to hold the pointers to all rows

    for(i=0; i<M_SIZE; i++) 
        aa[i] = a[i];     // initialize pointers to the `a` rows

    tqli(de,ee,M_SIZE,aa); // test

    free(aa);              // free memory for row pointers


   // 2.--------------------

   printf(" Second array is { {1,0,0,0}, {0,1,0,0}, {0,0,1,0}, {0,0,0,1} } \n"); 

   zepointer = malloc( M_SIZE * sizeof(double*));    // allocate memory to hold the pointers to all rows

   // allocate memory for every row to hold column elements
   for(i=0; i<M_SIZE; i++) 
      zepointer[i] = malloc (M_SIZE * sizeof (double )) ;

   // assign values from your ze[][] matrix 
   for(i=0; i<M_SIZE; i++) 
      for(j=0; j<M_SIZE; j++)
            zepointer[i][j] = ze[i][j];

   tqli(de,ee,M_SIZE,zepointer); // test

   // cleanup

   for(i=0; i<M_SIZE; i++)       // free memory allocated for row elements 
     free(zepointer[i]) ;

   free(zepointer);              // free memory for the row pointers      

   return 0;
}

输出:

 First method: array is { {6,7,8,9}, {1,6,1,5}, {6,2,2,4}, {1,2,3,4} } 
 z[0][0] = 6.000000 
 z[0][1] = 7.000000 
 z[0][2] = 8.000000 
 z[0][3] = 9.000000 

 z[1][0] = 1.000000 
 z[1][1] = 6.000000 
 z[1][2] = 1.000000 
 z[1][3] = 5.000000 

 z[2][0] = 6.000000 
 z[2][1] = 2.000000 
 z[2][2] = 2.000000 
 z[2][3] = 4.000000 

 z[3][0] = 1.000000 
 z[3][1] = 2.000000 
 z[3][2] = 3.000000 
 z[3][3] = 4.000000 

 Second method: array is { {1,0,0,0}, {0,1,0,0}, {0,0,1,0}, {0,0,0,1} } 
 z[0][0] = 1.000000 
 z[0][1] = 0.000000 
 z[0][2] = 0.000000 
 z[0][3] = 0.000000 

 z[1][0] = 0.000000 
 z[1][1] = 1.000000 
 z[1][2] = 0.000000 
 z[1][3] = 0.000000 

 z[2][0] = 0.000000 
 z[2][1] = 0.000000 
 z[2][2] = 1.000000 
 z[2][3] = 0.000000 

 z[3][0] = 0.000000 
 z[3][1] = 0.000000 
 z[3][2] = 0.000000 
 z[3][3] = 1.000000 

关于c - 如何解决警告 'double *' 与 'double (*)[4][4]' 的间接级别不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48867193/

相关文章:

java - 如何在android中嵌入一个c库

c - 用 C 抓取网页最简单的方法是什么? (通过 https)

c++ - 指向连续内存的指针

arrays - 复制 2 维矩阵以创建 3 维数组(在 R 中)

c : matrix multiplication without * operator

java - 从矩阵中删除行和列

c - LinkedList - 如何释放使用 malloc 分配的内存

c - VS2017 编译器为除法/余数对发出 2 个除法指令

c - 是否可以编写一个函数,该函数返回一个指向与其参数中的函数不同的函数的指针?

C - 使用 sprintf() 在字符串中添加前缀