[Rd] transpose of complex matrices in R
Duncan Murdoch
murdoch.duncan at gmail.com
Fri Jul 30 12:13:26 CEST 2010
Robin Hankin wrote:
> 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).
>
You should call base::t.default, not base::t. Then this will work. The
same solution fixes the one below, though you won't even need the base::
prefix on t.default.
Duncan Murdoch
> 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?
>
>
>
>
>
More information about the R-devel
mailing list