如何在c中使方法return成为double类型的二维数组
How to make a method return a two dimension array of type double in c
我在 c 中有一个方法用于计算三乘三矩阵的逆,这个方法 returns 一个 double 类型的二维向量,我在我的代码中声明了一个二维向量变量并尝试了分配但是当我尝试获取逆二维向量的元素时,代码不打印任何东西
计算 3 x 3 矩阵的逆矩阵的代码
#include <stdio.h>
#include <stdbool.h>
#include <conio.h>
double Determinant(double matrix[2][2]){
double det=0;
double a =matrix[0][0];
double b=matrix[0][1];
double c=matrix[1][0];
double d=matrix[1][1];
det=a*d-b*c;
return det;
}
double** inverseMatrix(double matrix[3][3]){
//define the entries for the matrix of minors
double m1,m2,m3,m4,m5,m6,m7,m8,m9;
//get the members of the matrix
double a=matrix[0][0];
double b=matrix[0][1];
double c=matrix[0][2];
double d=matrix[1][0];
double e=matrix[1][1];
double f=matrix[1][2];
double g=matrix[2][0];
double h=matrix[2][1];
double i=matrix[2][2];
//fill in the matrix of minors
m1=(e*i)-(h*f);
m2=d*i-g*f;
m3=d*h-g*e;
m4=b*i-h*c;
m5=a*i-g*c;
m6=a*h-g*b;
m7=b*f-e*c;
m8=a*f-d*c;
m9=a*e-d*b;
double minorArray[3][3];
minorArray[0][0]=m1;
minorArray[0][1]=m2;
minorArray[0][2]=m3;
minorArray[1][0]=m4;
minorArray[1][1]=m5;
minorArray[1][2]=m6;
minorArray[2][0]=m7;
minorArray[2][1]=m8;
minorArray[2][2]=m9;
//get the determinant //DEFINE THE MATRICES TO USE FOR THE DETERMINANT
double A[2][2];
A[0][0]=e;
A[0][1]=f;
A[1][0]=h;
A[1][1]=i;
double B[2][2];
B[0][0]=d;
B[0][1]=f;
B[1][0]=g;
B[1][1]=i;
double C[2][2];
C[0][0]=d;
C[0][1]=e;
C[1][0]=g;
C[1][1]=h;
double det=a*Determinant(A)-b*Determinant(B)+c*Determinant(C);
int index=0;
//get the matrix of co-factors
for(int row=0;row<3;row++){
for(int col=0;col<3;col++){
index+=1;
//check for entries at odd indices and negate them
if(index%2!=0){
minorArray[row][col]=-1*minorArray[row][col];
}
}
}
double answer[3][3];
//divide everything by the determinant
for(int row=0;row<3;row++){
for(int col=0;col<3;col++){
answer[row][col]=minorArray[row][col]/det;
}
}
//determinant is given by a*DET(MA)-b*(DET(MB)+c*DET(MC
double** ans= (double **) answer;
return ans;
}
然后我尝试将上述方法的结果赋值给我在main中声明的一个变量,然后打印出三乘三矩阵的逆矩阵的元素,但我的代码没有输出任何东西
//assigning vaues to the matrix
int kk=10;
double test[3][3];
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
test[i][j]=kk;
kk--;
}
}
//declare a 2d vector as pointer and assign the result of the method
double** answer=inverseMatrix(test);
//print out the elements of the function
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
printf("%.f ",answer[i][j]);
}
}
是否可以在 c 中执行此操作以及如何让我的代码成功打印出逆矩阵的成员?
我建议您将矩阵数组包装成结构,不同的结构对应不同的大小。这是一个:
struct Matrix3 {
double m[3][3];
};
为了方便,我们还添加一些常量,一个全局(静态或外部)变量:
const struct Matrix3 ZeroMatrix3; // globals are implicitly initialized to 0
const struct Matrix3 IdentityMatrix3 = { {
{ 1, 0, 0},
{ 0, 1, 0},
{ 0, 0, 1} } }
你的反函数可能会变成:
struct Matrix3 inverseMatrix3(const struct Matrix3 * restrict mp){
struct Matrix3 result = ZeroMatrix3;
// dummy code which does nothing:
result = *mp;
return result;
}
使用示例:
struct Matrix3 input = { {
{ 1, 2, 3},
{ 4, 5, 6},
{ 0, 0, 0} } };
struct Matrix3 inverse = inverseMatrix3(&input);
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
printf("%.f ", inverse.m[i][j]);
}
}
struct Matrix3 secondIdentity = inverseMatrix3(&IdentityMatrix3);
// you probably want to add a compare function at some point...
assert(compareMatrix3(&secondIdentity, &IdentityMatrix3)); // verify that inverse of identity works
这里的要点是,定义保存矩阵的简单结构。您可能想要添加更多结构,例如 struct Vector3
和 struct Matrix3x1
等等,您需要什么都行。然后你可以使用值从函数中 return 它们,并直接用 =
赋值它们,依此类推。
您也可以将它们作为值传递,但在这里它们作为指向 const struct 的指针传递,通常效率更高。也就是说,2x2 矩阵是 32 字节,3x3 矩阵是 72 字节,复制如此少量的字节非常快,所以通常尝试使用指向堆分配矩阵的指针进行优化甚至可能会减慢速度,并且肯定会增加很多的麻烦。这里使用restrict
keyword是一个小的优化,你真的不需要关心
我在 c 中有一个方法用于计算三乘三矩阵的逆,这个方法 returns 一个 double 类型的二维向量,我在我的代码中声明了一个二维向量变量并尝试了分配但是当我尝试获取逆二维向量的元素时,代码不打印任何东西
计算 3 x 3 矩阵的逆矩阵的代码
#include <stdio.h>
#include <stdbool.h>
#include <conio.h>
double Determinant(double matrix[2][2]){
double det=0;
double a =matrix[0][0];
double b=matrix[0][1];
double c=matrix[1][0];
double d=matrix[1][1];
det=a*d-b*c;
return det;
}
double** inverseMatrix(double matrix[3][3]){
//define the entries for the matrix of minors
double m1,m2,m3,m4,m5,m6,m7,m8,m9;
//get the members of the matrix
double a=matrix[0][0];
double b=matrix[0][1];
double c=matrix[0][2];
double d=matrix[1][0];
double e=matrix[1][1];
double f=matrix[1][2];
double g=matrix[2][0];
double h=matrix[2][1];
double i=matrix[2][2];
//fill in the matrix of minors
m1=(e*i)-(h*f);
m2=d*i-g*f;
m3=d*h-g*e;
m4=b*i-h*c;
m5=a*i-g*c;
m6=a*h-g*b;
m7=b*f-e*c;
m8=a*f-d*c;
m9=a*e-d*b;
double minorArray[3][3];
minorArray[0][0]=m1;
minorArray[0][1]=m2;
minorArray[0][2]=m3;
minorArray[1][0]=m4;
minorArray[1][1]=m5;
minorArray[1][2]=m6;
minorArray[2][0]=m7;
minorArray[2][1]=m8;
minorArray[2][2]=m9;
//get the determinant //DEFINE THE MATRICES TO USE FOR THE DETERMINANT
double A[2][2];
A[0][0]=e;
A[0][1]=f;
A[1][0]=h;
A[1][1]=i;
double B[2][2];
B[0][0]=d;
B[0][1]=f;
B[1][0]=g;
B[1][1]=i;
double C[2][2];
C[0][0]=d;
C[0][1]=e;
C[1][0]=g;
C[1][1]=h;
double det=a*Determinant(A)-b*Determinant(B)+c*Determinant(C);
int index=0;
//get the matrix of co-factors
for(int row=0;row<3;row++){
for(int col=0;col<3;col++){
index+=1;
//check for entries at odd indices and negate them
if(index%2!=0){
minorArray[row][col]=-1*minorArray[row][col];
}
}
}
double answer[3][3];
//divide everything by the determinant
for(int row=0;row<3;row++){
for(int col=0;col<3;col++){
answer[row][col]=minorArray[row][col]/det;
}
}
//determinant is given by a*DET(MA)-b*(DET(MB)+c*DET(MC
double** ans= (double **) answer;
return ans;
}
然后我尝试将上述方法的结果赋值给我在main中声明的一个变量,然后打印出三乘三矩阵的逆矩阵的元素,但我的代码没有输出任何东西
//assigning vaues to the matrix
int kk=10;
double test[3][3];
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
test[i][j]=kk;
kk--;
}
}
//declare a 2d vector as pointer and assign the result of the method
double** answer=inverseMatrix(test);
//print out the elements of the function
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
printf("%.f ",answer[i][j]);
}
}
是否可以在 c 中执行此操作以及如何让我的代码成功打印出逆矩阵的成员?
我建议您将矩阵数组包装成结构,不同的结构对应不同的大小。这是一个:
struct Matrix3 {
double m[3][3];
};
为了方便,我们还添加一些常量,一个全局(静态或外部)变量:
const struct Matrix3 ZeroMatrix3; // globals are implicitly initialized to 0
const struct Matrix3 IdentityMatrix3 = { {
{ 1, 0, 0},
{ 0, 1, 0},
{ 0, 0, 1} } }
你的反函数可能会变成:
struct Matrix3 inverseMatrix3(const struct Matrix3 * restrict mp){
struct Matrix3 result = ZeroMatrix3;
// dummy code which does nothing:
result = *mp;
return result;
}
使用示例:
struct Matrix3 input = { {
{ 1, 2, 3},
{ 4, 5, 6},
{ 0, 0, 0} } };
struct Matrix3 inverse = inverseMatrix3(&input);
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
printf("%.f ", inverse.m[i][j]);
}
}
struct Matrix3 secondIdentity = inverseMatrix3(&IdentityMatrix3);
// you probably want to add a compare function at some point...
assert(compareMatrix3(&secondIdentity, &IdentityMatrix3)); // verify that inverse of identity works
这里的要点是,定义保存矩阵的简单结构。您可能想要添加更多结构,例如 struct Vector3
和 struct Matrix3x1
等等,您需要什么都行。然后你可以使用值从函数中 return 它们,并直接用 =
赋值它们,依此类推。
您也可以将它们作为值传递,但在这里它们作为指向 const struct 的指针传递,通常效率更高。也就是说,2x2 矩阵是 32 字节,3x3 矩阵是 72 字节,复制如此少量的字节非常快,所以通常尝试使用指向堆分配矩阵的指针进行优化甚至可能会减慢速度,并且肯定会增加很多的麻烦。这里使用restrict
keyword是一个小的优化,你真的不需要关心