该程序如何工作?

时间:2019-05-23 16:30:47

标签: c

我找到了一个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;
}

2 个答案:

答案 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(如果您想了解用OcamlPythonLisp编码的等效程序,需要了解行列式)。在某些情况下,它们可能比矩阵的每个系数大得多(因为三个数字的乘积可能比每个数字大;这是基本代数)。所以, 您最好使用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中,%formodulo 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