所以我在互联网上搜索了带有克莱默规则的程序,有一些,但显然这些例子只适用于固定矩阵,如 2x2 或 4x4。
但是,我正在寻找一种解决NxN矩阵的方法。所以我开始并达到了向用户询问矩阵大小并要求用户输入矩阵值的地步,但随后我不知道如何从这里继续前进。
就像我想我的下一步是应用克莱默的规则并获得答案一样,但我只是不知道如何。这是我缺少的步骤。有人可以帮我吗?
首先,您需要计算方程组矩阵的行列式 - 即矩阵,由系数组成(从方程的左侧) - 让它为D。
然后,要计算某个变量的值,您需要取系统的矩阵(从上一步开始),将相应列的系数替换为常量项(从右侧开始),计算结果矩阵的行列式 - 让它为 C,然后将C除以D。
关于上一步替换的更多信息:比如说,你的矩阵如果是 3x3(如图所示) - 所以,你有一个方程组,其中每个a系数乘以x,每个b- 乘以y,每个c乘以z,ds 是常数项。因此,要计算y,请将本例中乘以y-bs 的系数替换为ds。
你对每个变量执行第二步,你的系统就解决了。
您可以在https://rosettacode.org/wiki/Cramer%27s_rule#C 中找到一个示例 尽管具体示例处理 4X4 矩阵,但编写代码以适应任何大小的方阵。
你需要的是计算行列式。克莱默规则仅适用于NxN
矩阵的行列式
如果 N 不大,你可以使用 Cramer 规则(见下面的代码),这很简单。 但是,这种方法效率不高;如果你的N很大,你需要求助于其他方法,比如Lu分解
假设您的数据是双倍的,并且结果可以保持双倍。
#include <malloc.h>
#include <stdio.h>
double det(double * matrix, int n) {
if( 1 >= n ) return matrix[ 0 ];
double *subMatrix = (double*)malloc(( n - 1 )*( n - 1 ) * sizeof(double));
double result = 0.0;
for( int i = 0; i < n; ++i ) {
for( int j = 0; j < n - 1; ++j ) {
for( int k = 0; k < i; ++k )
subMatrix[ j*( n - 1 ) + k ] = matrix[ ( j + 1 )*n + k ];
for( int k = i + 1; k < n; ++k )
subMatrix[ j*( n - 1 ) + ( k - 1 ) ] = matrix[ ( j + 1 )*n + k ];
}
if( i % 2 == 0 )
result += matrix[ 0 * n + i ] * det(subMatrix, n - 1);
else
result -= matrix[ 0 * n + i ] * det(subMatrix, n - 1);
}
free(subMatrix);
return result;
}
int main() {
double matrix[ ] = { 1,2,3,4,5,6,7,8,2,6,4,8,3,1,1,2 };
printf("%lfn", det(matrix, 4));
return 0;
}