C#Math.Net Matrix Determinant,返回错误的数字

时间:2015-03-07 20:01:10

标签: c# matrix

我想简化一下我的程序,我正在测试math.net,所以例如我得到了矩阵2x2,

det(A) = a * d - b * c = 71 * 137 - 130 * 107 = -4183

可以告诉我这里发生了什么,在第二个屏幕截图中,您可以看到Math.Net Determinant()函数返回-4183,00000000000000018。对于给定的矩阵,它是如何正确的?这个结果来自哪里?如果是双倍,则应为-4183.0

是否有某种算法可以计算得足够好"但是"快得多#34;对于大数据?

Screenshot 1

Screenshot 2

第二个问题,出于好奇,最简单的方法是使用这种方法完全反转矩阵模256:

A^(-1) = 1/det(A) * (A^D)^T

其中by (A^D)^T我指的是辅助因子的转置矩阵(我相信它是用英语调用的)

我编写了一个方法来做这个,它适用于矩阵或多维数组,但我很好奇在math.net中这样做的正确方法是什么,但使用我提到的等式。

和往常一样,我非常感谢每个答案的人。

(顺便说一句,是的,我知道我正在对很多演员表演,vars被宣告多次,但是试着忽略它,这只是一个测试领域)

让我的第一个问题更清晰 (你可以点击' - '你想要的一切,我都不在乎:))

@Szab 谢谢你的回答,我知道十进制数有这样的行为,但更确切地说:我想知道,为什么结果 - 4183,00000000000000018不同于: This Result 这里没有小数位,C#非常清楚地显示

det(A) = a * d - b * c = 71.0 * 137.0 - 130.0 * 107.0 = -4183.0

对于a,b,c,d和det都是双打。

/编辑

问题回答了,非常感谢你们。

1 个答案:

答案 0 :(得分:2)

我认为第一个问题的出现只是因为您使用的算法使用的是double类型的值。您可能知道,每个数字都在计算机的内存中表示为二进制值。这种表示的问题在于,并非每个十进制值都可以表示为具有100%准确度的二进制数(就像您不能以100%的准确度表示1/3)。这不是算法的错误。

此行为的另一个例子:

double a = 86.24;
double b = 86.25;
double c = b - a; // Should be 0.01, but is equal to 0.010000000000005116