[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Possible wrong matrix determinant value
From: |
Marco Guazzone |
Subject: |
Re: Possible wrong matrix determinant value |
Date: |
Wed, 13 May 2009 16:55:01 +0200 |
On Wed, May 13, 2009 at 3:09 PM, HALL, BENJAMIN PW
<address@hidden> wrote:
>
>
> |-----Original Message-----
> |From: Marco Guazzone [mailto:address@hidden
>
> |
> |It seems the function "det()" gives a wrong determinant value for
> |certain matrices.
> |
> |Look at the following code:
> |
> |--- [code_snip] ---
> |A=[0.5560, 0.2747, 0.5406, 0.7989; 0.1089, 0.8301, 0.8917, 0.8953;
> |0.9480, 0.9732, 0.2165, 0.8832; 0.0238, 0.6754, 0.2318, 0.4503]
> |det(A);
> |--- [/code_snip] ---
> |
> |The result (on my machine: Intel Core 2 Duo+Fedora 10 x86_64) with
> |octave 3.0.3 is: -0.078647
> |
> |However, trying with other tools/libraries, the above value seems to
> |be wrong. In fact:
> |
> |With Octave 3.0.3: -0.078647
> |With BOOST uBLAS 1.39: -0.07874537
> |With R 2.9.0: -0.07874537
> |With NumPy 1.2.0: -0.078745369636711721
> |With Mathematica 7: -0.07874537
> |
>
> Are you sure you entered exactly the same matrix into all the different
> codes? I get the following:
>
> Octave: -0.0786470081539579
> Mathematica: -0.07864700815395793
> Matlab: -0.078647008153958
> R: -0.078647008154
>
> ===================================================
> octave-3.0.0:
> octave:1> A=[0.5560, 0.2747, 0.5406, 0.7989; 0.1089, 0.8301, 0.8917,
> 0.8953;
>> 0.9480, 0.9732, 0.2165, 0.8832; 0.0238, 0.6754, 0.2318, 0.4503]
> A =
>
> 0.556000 0.274700 0.540600 0.798900
> 0.108900 0.830100 0.891700 0.895300
> 0.948000 0.973200 0.216500 0.883200
> 0.023800 0.675400 0.231800 0.450300
>
> octave:3> dd = det(A)
> dd = -0.078647
> octave:4> format long
> octave:5> dd
> dd = -0.0786470081539579
>
>
> ===================================================
> Matlab-7.7.0:
>>> A=[0.5560, 0.2747, 0.5406, 0.7989; 0.1089, 0.8301, 0.8917, 0.8953;
> 0.9480, 0.9732, 0.2165, 0.8832; 0.0238, 0.6754, 0.2318, 0.4503]
>
> A =
>
> 0.5560 0.2747 0.5406 0.7989
> 0.1089 0.8301 0.8917 0.8953
> 0.9480 0.9732 0.2165 0.8832
> 0.0238 0.6754 0.2318 0.4503
>
>
>>> dd = det(A);
>>> format long
>>> dd
>
> dd =
>
> -0.078647008153958
>
>
> ===================================================
> Mathematica-6.0:
> A = {{0.5560, 0.2747, 0.5406, 0.7989},
> {0.1089, 0.8301, 0.8917, 0.8953},
> {0.9480, 0.9732, 0.2165, 0.8832},
> {0.0238, 0.6754, 0.2318, 0.4503} };
> A // MatrixForm
>
> d = Det[A];
>
> Out[19]= -0.078647
>
> NumberForm[Det[A], 16]
>
> Out[32]= -0.07864700815395793
>
> ===================================================
> R-2.8.1:
>
> A <- matrix( c(0.5560, 0.2747, 0.5406, 0.7989,
> 0.1089, 0.8301, 0.8917, 0.8953,
> 0.9480, 0.9732, 0.2165, 0.8832,
> 0.0238, 0.6754, 0.2318, 0.4503), nrow=4, ncol=4 )
>
> A <- t(A) ## not that this matters for the determinant
>
>> A
> [,1] [,2] [,3] [,4]
> [1,] 0.5560 0.2747 0.5406 0.7989
> [2,] 0.1089 0.8301 0.8917 0.8953
> [3,] 0.9480 0.9732 0.2165 0.8832
> [4,] 0.0238 0.6754 0.2318 0.4503
>
>> det(A)
> [1] -0.07864701
>
>> print(sprintf("%.12f",det(A)))
> "-0.078647008154"
>
Oooooooops!!
You're right!
I really really sorry for this mistake.
Probably I fall into a cut&paste trap!
Here below are the results (matching with yours)
Octave: -0.0786470081539579
R: -0.07864701
Mathematica: -0.078647
NumPy: -0.07864700815395792
--- [octave] ---
A=[0.5560, 0.2747, 0.5406, 0.7989; 0.1089, 0.8301, 0.8917, 0.8953;
0.9480, 0.9732, 0.2165, 0.8832; 0.0238, 0.6754, 0.2318, 0.4503]
det(A)
--- [/octave] ---
==> -0.0786470081539579
--- [R] ---
A=matrix(c(0.5560, 0.2747, 0.5406, 0.7989,0.1089, 0.8301, 0.8917,
0.8953,0.9480, 0.9732, 0.2165, 0.8832,0.0238, 0.6754, 0.2318,
0.4503),nrow=4,ncol=4,byrow=T)
det(A)
--- [/R] ---
==> -0.07864701
--- [R (var2)] ---
library(Matrix)
A=Matrix(c(0.5560, 0.2747, 0.5406, 0.7989,0.1089, 0.8301, 0.8917,
0.8953,0.9480, 0.9732, 0.2165, 0.8832,0.0238, 0.6754, 0.2318,
0.4503),nrow=4,ncol=4,byrow=T)
determinant(A, log=F)
--- [/R (var2)] ---
==> -0.07864701
--- [numpy] ---
import numpy as np
A=np.matrix('0.5560, 0.2747, 0.5406, 0.7989; 0.1089, 0.8301, 0.8917,
0.8953; 0.9480, 0.9732, 0.2165, 0.8832; 0.0238, 0.6754, 0.2318,
0.4503'
np.linalg.det(A)
--- [/numpy] ---
==> -0.07864700815395792
--- [mathematica] ---
A = {{0.5560, 0.2747, 0.5406, 0.7989}, {0.1089, 0.8301, 0.8917,
0.8953}, {0.9480, 0.9732, 0.2165, 0.8832}, {0.0238, 0.6754, 0.2318,
0.4503}}
Det[A]
--- [/mathematica] ---
==> -0.078647
Thank you very much!!!
-- Marco