我找到了一个C程序来查找3x3矩阵的行列式,但我不知道它是如何工作的。
我对这部分感到困惑
for(i=0; i<3; i++) {
k = k + a[0][i] * (a[1][(i+1)%3] * a[2][(i+2)%3] - a[1][(i+2)%3] * a[2][(i+1)%3]);
}
3x3矩阵的行列式
a b c
d e f
g h i
行列式= a(ei-fh)-b(di-fg)+ c(dh-eg)
此处的公式具有-b(负b),但是代码中使用的公式中没有负数,所以它如何工作?
#include<stdio.h>
int main()
{
int a[10][10], i, j, k=0;
printf("Enter values of matrix: \n\n");
for(i=0; i<3; i++) {
for(j=0; j<3; j++) {
printf("Value of [%d][%d]: ", i, j);
scanf(" %d", &a[i][j]);
}
}
printf("Matrix is:\n\n");
for(i=0; i<3; i++) {
for(j=0; j<3; j++) {
printf("%d ", a[i][j]);
}
printf("\n\n");
}
for(i=0; i<3; i++) {
k = k + a[0][i] * (a[1][(i+1)%3] * a[2][(i+2)%3] - a[1][(i+2)%3] * a[2][(i+1)%3]);
}
printf("Determinant of the matrix is: %d \n", k);
return 0;
}
答案 0 :(得分:6)
该算法利用- b * (d * i - f * g)
等效于+ b * (f * g - d * i)
的事实。
您的
行列式= a(ei-fh)-b(di-fg)+ c(dh-eg)
成为
行列式= a(ei-fh)+ b(fg-di)+ c(dh-eg)
通过使用%3
循环回到行尾,直到每个行都具有相同的结构。
答案 1 :(得分:1)
该程序如何工作?
(我主要回答的是该标题;请注意,您的问题缺少some先前的研究工作)
详细了解determinants(如果您想了解用Ocaml,Python或Lisp编码的等效程序,需要了解行列式)。在某些情况下,它们可能比矩阵的每个系数大得多(因为三个数字的乘积可能比每个数字大;这是基本代数)。所以,
您最好使用floating point数字,因为它们的范围比整数大(今天的大多数计算机上,C int
不能超过2147483648,有关<limits.h>
standard header的更多信息)。当然,小于1024的数字的3x3行列式适合int
(但不适用于2000以上的 some 数字)。然后,您想阅读floating point guide。
int a[10][10], i, j, k=0;
为什么10为3 * 3的矩阵?如果您只关心3x3矩阵,则可以使用更好的代码int a[3][3]
!通常(并非总是)将automatic variable放在call stack上(并非总是如此)(对于编译器optimizations,它可能会进入processor registers甚至完全消失) 。如果您真的很在意程序的性能(稍后会更新以计算许多不同的行列式),请甚至考虑一下CPU cache。
在C中,%
是for的modulo operation。您应该阅读(并思考)更多有关它的内容。因此,请阅读C (programming language)维基页面。
首先阅读How to debug small programs,因为 debugging是了解程序行为的好方法(以其为semantics)。另请阅读优质的debugger, such as gdb
的文档,并使用所有警告和调试信息来编译程序,因此,如果使用with(优秀的C编译器,它是自由软件,则GCC gcc -Wall -g
)。
在C语言中进行编码时,使用调试器是一项必备技能。就您而言,您可能还使用了一些static source code analyzer,例如Frama-C,但是它们是复杂的工具,与使用调试器相比,学习使用它们要困难得多。您也可以尝试使用Clang static analyzer。
您还需要阅读所使用功能的文档,尤其是scanf的文档。它可能会失败,您应该对此进行测试,但您的C代码却不会。
享受学习用C语言编程的知识。有很多sites和书籍可以帮助您完成这一旅程。
也请阅读Norvig的页面Teach yourself programming in ten years,它与您的问题非常相关。您的伪 Thinker 很不错,它提醒您您需要考虑程序。在您的情况下,请使用基本algebra。