MathGroup Archive 1997

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Transpose

  • To: mathgroup at
  • Subject: [mg5703] Re: [mg5679] Transpose
  • From: Allan Hayes <hay at>
  • Date: Sat, 11 Jan 1997 14:29:03 -0500
  • Sender: owner-wri-mathgroup at

marliesb at (Marlies Brinksma)
in [mg5679] Transpose

>Now suppos matrix is a square matrix. Why gives  
>Transpose[matrix,{1,1}] the diagonal?


First, let's look at the way we extract the elements of a tensor T.
Suppose that its tensor rank is 4 and that its dimensions  are   
{d1,d2, ..., d4} then we need 4 positive integers  a1,a2, ..., a4 to  
get an element :
		T[[a1, a2, ... , a4]]
and we must have  ai L di for all i.
Now, Transpose[ T, {2,1,3,2}]] is a new tensor that given three   
positive integers a1, a2, a3  will return the value

Transpose[ T, {2,1,2,3}] [[ a1,a2,a3]]  =  T[[a2, a1, a2, a3]]

We only need three numbers because the repeated 2 uses the second  
one twice. So the new tensor rank is 3  and we must have   a1 Ld2,  
a2 L d1, a2 L d3, a3 L d4 (in fact we also impose the condition d1 =  
d3); its dimensions  are  {d2, d1,d4}
	Transpose[ T, {2,1,1,2}] [[ a1,a2]]  =  T[[a2, a1, a1, a2]]
the transposed vector has rank 2 and dimensions  {d2, d1} (and we  
impose the conditiions d1 = d4 and d2 = d3 )
T = Array[SequenceForm,{2,4,4,2}];

	{2, 4, 4, 2}

	{{1111, 2112}, {1221, 2222}, {1331, 2332}, {1441, 2442}}

	{4, 2}

The general pattern for elements is
Transpose[T_, p_List][[a__]] = T[[Sequence@@({a}[[p]])]]

In the examples so far the length of  p  has been equal to the  
tensor rank T (this is needed t o provide the right number of inputs  
to T). But it would be inconvenient always to have to provide the  
full sequence, so, for example, for a tensor T of tensor rank 5  
Mathematica interprets
	Transpose[ T, {2,1,1}] as Transpose[ T, {2,1,1,3,4}]
(appending successive integers from the first positive integer not  
appearing in {2,1,1}).

So much for the elements.
But  how do we construct the transposed tensor itself as an array?
Well, that's the job of the Array function.
Here is my version, Trans.
Notice that we don't need to allow for extending  p  -- this is  
automatically taken care of

Trans[T_, p_List] :=
	Block[{dims, trdims},
		dims = Dimensions[T];
		trdims =
		Array[ T[[Sequence@@({##}[[p]])]]&, trdims ]

The conditions imposed by Transpose are (where the rank of T is  r  
and its dimensions are  {d1,  d2 , . . . , dr }).
 1. Union[ p]   is Range[t] for some t L r;
 2. whenever   pj = pk then  dj = dk. (where p = {p1, p2  , . . pr}) 	

The transposed  tensor is of rank r minus the number of repeats in  
p and, as for dimensions, if s occurs  in at position  t  in  p then  
sth dimension is  dt , otherwise the sth dimension can be worked  
out by extending  p  as  discusssed above.

Trans[T,{2,1,1,2}] === Transpose[T,{2,1,1,2}]
Trans[T,{2,1,1}] === Transpose[T,{2,1,1}]
Trans[T,{1,2,2}] === Transpose[T,{1,2,2}]

For a square matrix  M, Transpose[M, {1,1}] is the diagonal of M  
		Transpose[M, {1,1}][[a]] = M[[a,a]]
Transpose[{{a,A},{b,B}}, {1,1}]
	{a, B}

Transpose[{{a,A},{b,B},{c,C}}, {1,1}]
	Transpose::perm: {1, 1} is not a permutation.

Transpose[{{a, A}, {b, B}, {c, C}}, {1, 1}]

The message really means  that  the condition 2. is not met.

Allan Hayes
hay at

  • Prev by Date: Image Processing: Mathematica?
  • Next by Date: Re: Transpose
  • Previous by thread: Transpose
  • Next by thread: Re: Transpose