Skip to content
Prev 15549 / 63424 Next

NaN and linear algebra

Although both Linux and OSX produce an error the behavior of LAPACK is 
not similar.

(It would be nice if someone using Windows could try the following test 
too)

(1) Compile the following C code

void testdgesv(long* N, long* NRHS, double* A, long* LDA, long* IPIVOT, 
double* B, long* LDB, long* INFO)
{
   DGESV(N, NRHS, A, LDA, IPIVOT, B, LDB, INFO);
}

(you will have to use the right combination of case and _s)

(2) Run these commands in R:

dyn.load("test.so")
N <- as.integer(3)
NRHS <- as.integer(3)
A <- matrix(as.double(NaN), 3, 3)
LDA <- as.integer(3)
IPIVOT <- integer(3)
B <- diag(3)
storage.mode(B) <- "double"
LDB <- as.integer(3)
INFO <- as.integer(0)

.C("testdgesv", N = N, NRHS = NRHS, A = A, LDA = LDA, IPIVOT = IPIVOT, 
B = B, LDB = LDB, INFO = INFO, NAOK = TRUE)

$N
[1] 3

$NRHS
[1] 3

$A
      [,1] [,2] [,3]
[1,]  NaN  NaN  NaN
[2,]  NaN  NaN  NaN
[3,]  NaN  NaN  NaN

$LDA
[1] 3

$IPIVOT
[1] 1 2 3

$B
      [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    1    0
[3,]    0    0    1

$LDB
[1] 3

$INFO
[1] 3

//////////////////

On my Mac mini this exits with no errors or warnings (other than INFO = 
3 anyway).  However,

solve(A)

generates the error:

Error in solve.default(A) : Lapack routine dgesv: system is exactly 
singular

This behavior seems to suggest that error is generated somewhere in R, 
not in LAPACK.

Okay, now for the weird bit.

When I run this in Linux I get:

 > .C("testdgesv", N = N, NRHS = NRHS, A = A, LDA = LDA, IPIVOT = 
IPIVOT, B = B, LDB = LDB, INFO = INFO, NAOK = TRUE)
$N
[1] 3

$NRHS
[1] 3

$A
      [,1] [,2] [,3]
[1,]  NaN  NaN  NaN
[2,]  NaN  NaN  NaN
[3,]  NaN  NaN  NaN

$LDA
[1] 3

$IPIVOT
[1] 3 2 3

$B
      [,1] [,2] [,3]
[1,]  NaN  NaN  NaN
[2,]  NaN  NaN  NaN
[3,]  NaN  NaN  NaN

$LDB
[1] 3

$INFO
[1] 0

where INFO == 0 indicates "successful exit" but

 > solve(A)
Error in solve.default(A) : system is computationally singular: 
reciprocal condition number = 0



In case it is important:

platform powerpc-apple-darwin7.8.0
arch     powerpc
os       darwin7.8.0
system   powerpc, darwin7.8.0
status
major    2
minor    0.1
year     2004
month    11
day      15
language R

and

platform i686-pc-linux-gnu
arch     i686
os       linux-gnu
system   i686, linux-gnu
status
major    2
minor    0.1
year     2004
month    11
day      15
language R

prompt> more Makevars
PKG_LIBS=${LAPACK_LIBS} ${BLAS_LIBS} ${FLIBS}