From rksh1 at cam.ac.uk  Fri Jul 30 11:35:28 2010
From: rksh1 at cam.ac.uk (Robin Hankin)
Date: Fri, 30 Jul 2010 10:35:28 +0100
Subject: [Rd] transpose of complex matrices in R
Message-ID: <4C529CE0.2070408@cam.ac.uk>

Hello everybody

When one is working with complex matrices, "transpose"  very nearly 
always means
*Hermitian* transpose, that is, A[i,j] <- Conj(A[j,i]).
One often writes A^* for the Hermitian transpose.

I have only once seen a  "real-life" case
where transposition does not occur simultaneously with complex conjugation.
And I'm not 100% sure that that wasn't a mistake.

Matlab and Octave sort of recognize this, as "A'" means the  Hermitian 
transpose of "A".

In R, this issue makes t(), crossprod(), and tcrossprod() pretty much 
useless to me.

OK, so what to do?  I have several options:

1.  define functions myt(), and mycrossprod() to get round the problem:
myt <- function(x){t(Conj(x))}

2.  Try to redefine t.default():

  t.default <- function(x){if(is.complex(x)){return(base::t(Conj(x)))} 
else {return(base::t(x))}}
(This fails because of infinite recursion, but I don't quite understand 
why).

3.  Try to define a t.complex() function:
t.complex <- function(x){t(Conj(x))}
(also fails because of recursion)

4. Try a kludgy workaround:
   t.complex <- function(x){t(Re(x)) - 1i*t(Im(x))}


Solution 1 is not good because it's easy to forget to use myt() rather 
than t()
and it does not seem to be  good OO practice.

As Martin Maechler points out, solution 2 (even if it worked as desired)
would break the code of everyone who writes a myt() function.

Solution 3 fails and solution 4 is kludgy and inefficient.

Does anyone have any better ideas?




-- 
Robin K. S. Hankin
Uncertainty Analyst
University of Cambridge
19 Silver Street
Cambridge CB3 9EP
01223-764877



[Rd] transpose of complex matrices in R
Robin Hankin