The logarithm of a tensor

I want to take the logarithm of a tensor, what do I do

Do you mean element by element? How do you define the operation?
What does your input look like?

Let’s say I have A tensor of third order ,then,I want to know how to calculate e^A or log(A)

I believe this is because tensor multiplication is not defined, unlike a square matrix (where the matrix multiplication is defined)

2 Likes

Have a look at my tensor package

https://github.com/chakravala/Grassmann.jl

It supports expnentiation and log of arbitrary tensors, although the fully general log method is not as well implemented as the exp method yet.

It uses a Clifford algebra representation for tensors.

2 Likes

If you want element-wise operations, those are written as log.(A) and exp.(A) in Julia.

5 Likes

I don’t mean element by element

I can’t find a logarithm operation in this package

It’s not clear to me what you mean by the log of a tensor. Logs are defined when you have an algebra, ie you can square a tensor. I imagine you mean that you contract A*B with the two last indices of A and the two first of B? If that is the case then you can get your log by reshaping your tensor as a matrix (with reshape) and reshaping back.

It’s in there in src/composite.jl

https://github.com/chakravala/Grassmann.jl/blob/master/src/composite.jl

Tensor multiplication is actually defined, if you use the Clifford product to multiply the tensors representation. The logarithm can be defined in terms of a series expansion with Clifford multiplication. In this case, using qlog:

Base.log(t::T) where T<:TensorAlgebra = qlog((t-1)/(t+1))
Base.log1p(t::T) where T<:TensorAlgebra = qlog(t/(t+2))

After first applying a transformation to the input. However, this method can diverge with some input.

In the Grassmann.jl package, there are several options, including an approximate but faster log_fast along with the slightly more robust Base.log with qlog.