Converts a \(k\)-tensor to alternating form

Alt(S,give_kform)

Arguments

S

A multilinear form, an object of class ktensor

give_kform

Boolean, with default FALSE meaning to return an alternating \(k\)-tensor [that is, an object of class ktensor that happens to be alternating] and TRUE meaning to return a \(k\)-form [that is, an object of class kform]

Details

Given a \(k\)-tensor \(T\), we have

$$\mathrm{Alt}(T)\left(v_1,\ldots,v_k\right)= \frac{1}{k!}\sum_{\sigma\in S_k}\mathrm{sgn}(\sigma)\cdot T\left(v_{\sigma(1)},\ldots,v_{\sigma(k)}\right) $$

Thus for example if \(k=3\):

$$\mathrm{Alt}(T)\left(v_1,v_2,v_3\right)= \frac{1}{6}\left(\begin{array}{c} +T\left(v_1,v_2,v_3\right)\quad -T\left(v_1,v_3,v_2\right)\cr -T\left(v_2,v_1,v_3\right)\quad +T\left(v_2,v_3,v_1\right)\cr +T\left(v_3,v_1,v_2\right)\quad -T\left(v_3,v_2,v_1\right) \end{array} \right) $$

and it is reasonably easy to see that \(\mathrm{Alt}(T)\) is alternating, in the sense that

$$\mathrm{Alt}(T)\left(v_1,\ldots,v_i,\ldots,v_j,\ldots,v_k\right)= -\mathrm{Alt}(T)\left(v_1,\ldots,v_j,\ldots,v_i,\ldots,v_k\right) $$

Function Alt() is intended to take and return an object of class ktensor; but if given a kform object, it just returns its argument unchanged.

A short vignette is provided with the package: type vignette("Alt") at the commandline.

Value

Returns an alternating \(k\)-tensor. To work with \(k\)-forms, which are a much more efficient representation of alternating tensors, use as.kform().

Author

Robin K. S. Hankin

See also

Examples



(X <- ktensor(spray(rbind(1:3),6)))
#> A linear map from V^3 to R with V=R^3:
#>            val
#>  1 2 3  =    6
Alt(X)
#> A linear map from V^3 to R with V=R^3:
#>            val
#>  3 2 1  =   -1
#>  3 1 2  =    1
#>  2 3 1  =    1
#>  2 1 3  =   -1
#>  1 3 2  =   -1
#>  1 2 3  =    1
Alt(X,give_kform=TRUE)
#> An alternating linear map from V^3 to R with V=R^3:
#>            val
#>  1 2 3  =    1

S <- as.ktensor(expand.grid(1:3,1:3),rnorm(9))
S
#> A linear map from V^2 to R with V=R^3:
#>                   val
#>  3 3  =  -0.244199607
#>  2 3  =  -0.247325302
#>  1 3  =  -1.821817661
#>  3 2  =   1.148411606
#>  2 2  =   0.621552721
#>  1 2  =  -0.005571287
#>  3 1  =  -2.437263611
#>  2 1  =   0.255317055
#>  1 1  =  -1.400043517
Alt(S)
#> A linear map from V^2 to R with V=R^3:
#>                 val
#>  3 2  =   0.6978685
#>  3 1  =  -0.3077230
#>  2 3  =  -0.6978685
#>  1 3  =   0.3077230
#>  2 1  =   0.1304442
#>  1 2  =  -0.1304442

issmall(Alt(S) - Alt(Alt(S)))  # should be TRUE; Alt() is idempotent
#> [1] TRUE

a <- rtensor()
V <- matrix(rnorm(21),ncol=3)
LHS <- as.function(Alt(a))(V)
RHS <- as.function(Alt(a,give_kform=TRUE))(V)
c(LHS=LHS,RHS=RHS,diff=LHS-RHS)
#>           LHS           RHS          diff 
#> -2.071708e-01 -2.071708e-01  1.665335e-16