Sums over repeated indices in an array.

contraction(x, i = NULL, drop = TRUE)

Arguments

x

indexed array. See index.

i

subset of repeated indices to sum up. If NULL, the summation takes place on all the repeated indices.

drop

logical. Drop summation indices? If FALSE, keep dummy dimensions.

Value

array.

References

Guidotti E (2022). "calculus: High-Dimensional Numerical and Symbolic Calculus in R." Journal of Statistical Software, 104(5), 1-37. doi:10.18637/jss.v104.i05

See also

Other tensor algebra: delta(), diagonal(), einstein(), epsilon(), index()

Examples

### matrix trace
x <- matrix(letters[1:4], nrow = 2)
contraction(x)
#> [1] "a + d"

### tensor trace
x <- array(1:27, dim = c(3,3,3))
contraction(x)
#> [1] 42

#### tensor contraction over repeated indices
x <- array(1:27, dim = c(3,3,3))
index(x) <- c("i","i","j")
contraction(x)
#> [1] 15 42 69

#### tensor contraction over specific repeated indices only
x <- array(1:16, dim = c(2,2,2,2))
index(x) <- c("i","i","k","k")
contraction(x, i = "k")
#>      [,1] [,2]
#> [1,]   14   18
#> [2,]   16   20

#### tensor contraction keeping dummy dimensions
x <- array(letters[1:16], dim = c(2,2,2,2))
index(x) <- c("i","i","k","k")
contraction(x, drop = FALSE)
#>      [,1] [,2]
#> [1,] "a"  "m" 
#> [2,] "d"  "p"