我正在尝试使用下载的 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/