       Re: Thread::tdlen: Objects of unequal length

• To: mathgroup at smc.vnet.net
• Subject: [mg121923] Re: Thread::tdlen: Objects of unequal length
• From: "David Park" <djmpark at comcast.net>
• Date: Thu, 6 Oct 2011 04:26:28 -0400 (EDT)
• Delivered-to: l-mathgroup@mail-archive0.wolfram.com
• References: <18407677.92785.1317799907818.JavaMail.root@m06>

```To go straight for the answer:

(svector = {x1, x2, x3, x4}) // MatrixForm
(tmatrix = {{0.0284435, 0.00395759, 0.000211963,
0.0357403}, {0.00395759,
0.0113862, -0.000199939, -0.000556137}, {0.000211963, \
-0.000199939,
0.00118147, -0.00043913}, {0.0357403, -0.000556137, -0.00043913,
0.0649449}
}) // MatrixForm

svector.tmatrix.svector // Expand

The general rules for multiplying (or contracting) arrays of various orders,
with contractions occurring at various levels, are:

The Prime Rule for Products of 'Tensor' Arrays in Mathematica:
S.T dots the lowest level of S with the highest level of T,
or equivalently
S.T dots the last level of S with the first level of T.

The Mathematica Transpose[T,{n1,n2,n3,...}] moves levels {1,2,3,...} to
levels {n1,n2,n3,...}. We will always want to move the contracted level to
the first or last level when doing Dot products and to the first two levels
when doing single array contractions.

If R, S, T,... are Mathematica tensor arrays, then their direct product is
given by Outer[Times,R,S,T,...]. This will produce a single Mathematica
array. The levels are in the same order as the levels in the successive
arrays.

The basic Mathematica command for contraction of the top two levels in a
single array T is Tr[T,Plus,2]. We will have to use Transpose on T to put
the contraction slots in the first two levels. We will have to repeat the
operation if we want to do multiple contractions.

You just have to remain level headed.

David Park
djmpark at comcast.net
http://home.comcast.net/~djmpark/

From: SysInv [mailto:johan at systeminvestors.se]

This problem is driving me crazy. I'm trying to multiply matrices, where one
is 1x4 (s) and the other is 4x4 (t) and the multiplication is
s*t*Transpose[s]

Despite this I get the error message that the objects is of unequal length.
The matrices are:

s={{x1,x2,x3,x4}}

t={0.0284435,0.00395759,0.000211963,0.0357403},{0.00395759,0.0113862,-0.0001
99939,-0.000556137},{0.000211963,-0.000199939,0.00118147,-0.00043913},{
0.0357403,-0.000556137,-0.00043913,0.0649449}

I must use double level in the 1 row matrix, since otherwise Transpose[]
complains that it needs at least 2 levels. I tried without this as well, but
I keep getting:

Thread::tdlen : Objects of unequal length in
{{x1,x2,x3,x4}}{{0.0284435,0.00395759,0.000211963,0.0357403},<<2>>,{<<10>>,<
<3>>}}{{x1},{x2},{x3},{x4}} cannot be combined. >>

. when I run s*t*Transpose[s].

I've spent hours trying to figure this simple problem out, but without any
luck. Any pointers guys? It doesn't help if I change the order of the
transpose...

```

• Prev by Date: Re: DynamicModule Pure Function
• Next by Date: Re: DynamicModule Pure Function
• Previous by thread: Re: Thread::tdlen: Objects of unequal length
• Next by thread: Dynamic evaluation not automatically enabled in CDF documents