Skip to content

unexpected behaviour of isSymmetric() (PR#14000)

3 messages · mike at stat.ubc.ca, Romain Francois, Douglas Bates

#
Full_Name: Mike Danilov
Version: 2.9.0
OS: Fedora Core 9
Submission from: (NULL) (142.103.121.198)


When checking for the symmetry of a matrix, function isSymmetric.matrix() gets
confused by the discrepancy of colnames/rownames if its argument. See the code
snippet below. Perhaps it's a problem of the matrix product which copies
colnames of the first argument but not the rownames of the second to its value.
Not sure which one should be fixed but the way it is now it seems illogical that
X'X is deemed to be non-symmetric.

x <- c(1,2,3)
names(x) <- c("v1","v2","v3")
isSymmetric(x%*%t(x)) ## returns FALSE instead of TRUE
#
On 10/12/2009 02:05 AM, mike at stat.ubc.ca wrote:
It seems to be concerned with the names

 > y <- x %*% t(x)
 > y
      v1 v2 v3
[1,]  1  2  3
[2,]  2  4  6
[3,]  3  6  9

 > isSymmetric( y )
[1] FALSE

# dropping the dimnames
 > isSymmetric( structure( y, dimnames = NULL ) )
[1] TRUE

# pass the ... along this path : isSymmetric > all.equal > all.equal.numeric
 > isSymmetric( y, check.attributes = F )
[1] TRUE

# set the dimnames equal
 > dimnames( y ) <- rep( list( names(x) ), 2 )
 > isSymmetric( y )
[1] TRUE

Not sure this is expected behaviour

Romain
#
On Mon, Oct 12, 2009 at 6:41 AM, Romain Francois
<romain.francois at dbmail.com> wrote:
I think the problem is more with the propagation of the column names
in the construction x %*% t(x).  If you use the tcrossprod function to
create x %*% t(x) more carefully then the results are sensible
[1] TRUE
[,1] [,2] [,3]
[1,]    1    2    3
[2,]    2    4    6
[3,]    3    6    9