Ways to compute inner products of tensors
If we transpose the indices of $v$ and $w$ so that $v'_{abe} = v_{aeb}$ and $w'_{ecd} = w_{ced}$, then we can compute $u = v' \cdot w'$:
u === Transpose[v, {1, 3, 2}] . Transpose[w, {2, 1, 3}]
(* True *)
We can use a similar trick to compute $q$ if we reorder $v_{dea} \to v''_{ade}$, except that this time the $d$ and $e$ indices in $v_{ade}''$ and $w_{deb}$ must treated as if they comprised a single index to be contracted. Flatten
can do this for us:
q === Flatten[v, {{3}, {1, 2}}] . Flatten[w, {{1, 2}, {3}}]
(* True *)
For details about the Flatten
syntax used here, see Flatten command: matrix as second argument.
In Mathematica version 9, you can do these kinds of things much more naturally. Here are the two quantities that you wanted:
u = TensorContract[TensorProduct[v, w], {2, 5}];
q = TensorContract[TensorProduct[v, w], {{1, 4}, {2, 5}}];
The contraction is performed on the tensor product in which the first three indices belong to the factor v
and the last three indices label w
. Therefore, the indices corresponding to $e$ in your sum for u
are in slots {2, 5}
, and the two summations for q
run over slots {1, 4}
(for the variable $d$) and {2,5}
(as in v
).
Since the question "Efficient tensor product followed by contraction" asking for an efficient solution to this problem has been marked as a duplicate, I find it appropriate to add here an encapsulated version of the answer to that question by @m_goldberg. Note that this works efficiently for the contraction of any number of index pairs. The notation follows Mathematica's TensorContract.
TensorMultiply[ A, B, {{$a_1$,$b_1$},{$a_2$,$b_2$},...} ]
$\hspace{7.5mm}$yields the tensor product of tensors A and B in the pairs {$a_i$,$b_i$} of slots.
TensorMultiply[A_, B_, pairs_] :=
Activate@TensorContract[
Inactive[TensorProduct][A, B], (# + {0, TensorRank[A]}) & /@ pairs];