--- title: "Function `tensorprod()` function in the `stokes` package" author: "Robin K. S. Hankin" output: html_vignette bibliography: stokes.bib link-citations: true vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{tensorprod} %\usepackage[utf8]{inputenc} --- ```{r setup, include=FALSE} set.seed(0) library("spray") library("stokes") options(rmarkdown.html_vignette.check_title = FALSE) knitr::opts_chunk$set(echo = TRUE) knit_print.function <- function(x, ...){dput(x)} registerS3method( "knit_print", "function", knit_print.function, envir = asNamespace("knitr") ) ``` ```{r out.width='20%', out.extra='style="float:right; padding:10px"',echo=FALSE} knitr::include_graphics(system.file("help/figures/stokes.png", package = "stokes")) ``` ```{r, label=showAlt,comment=""} tensorprod tensorprod2 ``` To cite the `stokes` package in publications, please use @hankin2022_stokes. Function `tensorprod()` returns the tensor cross product of any number of `ktensor` objects; `tensorprod2()` is a lower-level helper function that returns the product of two such objects. These functions use `spraycross()` from the `spray` package [@hankin2022_spray]. ### The tensor cross product In a memorable passage, @spivak1965 states:
Integration on chains
If $V$ is a vector space over $\mathbb{R}$, we denote the $k$-fold product $V\times\cdots\times V$ by $V^k$. A function $T\colon V^k\longrightarrow\mathbb{R}$ is called *multilinear* if for each $i$ with $1\leqslant i\leqslant k$ we have $$ T\left(v_1,\ldots, v_i + {v'}_i,\ldots, v_k\right)= T\left(v_1,\ldots,v_i,\ldots,v_k\right)+ T\left(v_1,\ldots,{v'}_i,\ldots,v_k\right),\\ T\left(v_1,\ldots,av_i,\ldots,v_k\right)=aT\left(v_1,\ldots,v_i,\ldots,v_k\right). $$ A multilinear function $T\colon V^k\longrightarrow\mathbb{R}$ is called a *$k$-tensor* on $V$ and the set of all $k$-tensors, denoted by $\mathcal{J}^k(V)$, becomes a vector space (over $\mathbb{R}$) if for $S,T\in\mathcal{J}^k(V)$ and $a\in\mathbb{R}$ we define $$ (S+T)(v_1,\ldots,v_k) = S(v_1,\ldots,v_k) + T(v_1,\ldots,v_k)\\ (aS)(v_1,\ldots,v_k) = a\cdot S(v_1,\ldots,v_k). $$ There is also an operation connecting the various spaces $\mathcal{J}(V)$. If $S\in\mathcal{J}^k(V)$ and $T\in\mathcal{J}^l(V)$, we define the *tensor product* $S\otimes T\in\mathcal{J}^{k+l}(V)$ by $$ S\otimes T(v_1,\ldots,v_k,v_{k+1},\ldots,v_{k+l})= S(v_1,\ldots,v_k)\cdot T(v_{k+1},\ldots,v_{k+l}). $$
- Michael Spivak, 1969 (Calculus on Manifolds, Perseus books). Page 75