I'd try TensorOperations.jl or AxisAlgorithms.jl
Best,
--Tim
On Sunday, June 26, 2016 4:24:17 AM CDT Alex Williams wrote:
> I'm trying to code an efficient implementation of the n-mode tensor
> product. Basically, this amounts to taking a dot product between a vector
> (b) and the mode-n fibers of a higher-order Array. For example, the mode-3
> product of a 4th order array is:
>
> ```
> C[i,j,k] = dot(A[i,j,:,k], b)
> ```
>
> After iterating over all (i,j,k). Doing this for any arbitrary `A` and `n`
> can be achieved by the function below. But I believe it is slower than
> necessary due to the use of the splatting operator (`...`). Any ideas for
> making this faster?
>
> ```julia
> """
> B = tensordot(A, b, n)
> Multiply N-dimensional array A by vector b along mode n. For inputs
> size(A) = (I_1,...,I_n,...,I_N), and length(x) = (I_n), the output is
> a (N-1)-dimensional array with size(B) = (I_1,...,I_n-1,I_n+1,...,I_N)
> formed by taking the vector dot product of b and the mode-n fibers
> of B.
> """
> function tensordot{T,N}(A::Array{T,N}, b::Vector{T}, n::Integer)
>
> I = size(A)
> @assert I[n] == length(b)
> D = I[setdiff(1:N,n)]
> K = [ 1:d for d in D ]
>
> # preallocate result
>
> C = Array(T,D...)
>
> # do multiplication
> for i in product(K...)
> C[i...] = dot(b, vec(A[i[1:(n-1)]...,:,i[n:end]...]))
> end
>
> return C
>
> end
> ```
>
> Thanks all,
>
> -- Alex