所以我在互联网上搜索了 Cramer's Rule 的程序,并且有一些,但显然这些例子只适用于2x2或4x4的固定矩阵。
但是,我正在寻找一种解决NxN矩阵的方法。所以我开始并向用户询问矩阵的大小,并要求用户输入矩阵的值,但后来我不知道如何从这里继续前进。
正如我猜我的下一步是应用Cramer的规则并得到答案,但我不知道如何。This is the step I'm missing。请有人帮帮我吗?
答案 0 :(得分:0)
首先,你需要计算你的方程系统矩阵的行列式 - 即矩阵,它由系数组成(从方程的左边) - 让它 D
然后,要计算某个变量的值,需要取系统的矩阵(从上一步开始),用常数项(从右侧)替换相应列的系数,计算结果矩阵的决定因素 - 让它为 C ,并将 C 除以 D 。
关于上一步替换的更多信息:比如说,你的矩阵是3x3(如图中所示) - 所以,你有一个方程组,其中每个 a 系数乘以 x ,每 b - 按 y ,每 c 按 z , d 是不变的术语。因此,要计算 y ,在这种情况下替换那些乘以 y - b 的系数,其中 d 第
您为每个变量执行第二步,系统就会得到解决。
答案 1 :(得分:0)
您可以在https://rosettacode.org/wiki/Cramer%27s_rule#C中找到一个示例 虽然具体示例涉及4X4矩阵,但代码的编写是为了适应任何大小的方阵。
答案 2 :(得分:0)
您需要的是计算行列式。 Cramer的规则仅适用于NxN
矩阵的行列式
如果N不大,你可以使用Cramer的规则(见下面的代码),这非常简单。但是,这种方法效率不高;如果您的N很大,则需要采用其他方法,例如lu decomposition
假设您的数据是双倍的,结果可以保持双倍。
#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("%lf\n", det(matrix, 4));
return 0;
}