Skip to content

Instantly share code, notes, and snippets.

@tinybike
Last active August 29, 2015 14:17
Show Gist options
  • Save tinybike/b10699900ed10b420934 to your computer and use it in GitHub Desktop.
Save tinybike/b10699900ed10b420934 to your computer and use it in GitHub Desktop.
Swap dimensions of 3rd and 4th order tensors
# Swap dimensions of ("transpose") 3rd and 4th order tensors
# @author Jack Peterson (jack@tinybike.net)
function _transpose{T<:Real}(tensor::Array{T,3}, permute::Vector{Int})
shape = size(tensor)
ttensor = zeros(shape)
idx = zeros(3)
for idx[1] = 1:shape[1]
for idx[2] = 1:shape[2]
for idx[3] = 1:shape[3]
ttensor[idx[permute]...] = tensor[idx...]
end
end
end
ttensor
end
function _transpose{T<:Real}(tensor::Array{T,4}, permute::Vector{Int})
shape = size(tensor)
ttensor = zeros(shape)
idx = zeros(4)
for idx[1] = 1:shape[1]
for idx[2] = 1:shape[2]
for idx[3] = 1:shape[3]
for idx[4] = 1:shape[4]
ttensor[idx[permute]...] = tensor[idx...]
end
end
end
end
ttensor
end
function _corners{T<:Real}(tensor::Array{T})
shape = size(tensor)
N = ndims(tensor)
z = zeros(N)
corners = zeros(shape...)
for i = 1:shape[1]
idx = z + i
corners[idx...] = tensor[idx...]
end
corners
end
function _pairs{T<:Real}(tensor::Array{T,3}, swapped::Vector{Int})
shape = size(tensor)
N = ndims(tensor)
pairs = zeros(shape)
swapped = sort(swapped)
for i = 1:shape[1]
if swapped == [1,2]
pairs[:,:,i] = _corners(convert(Array, slice(tensor, :, :, i)))
elseif swapped == [1,3]
pairs[:,i,:] = _corners(convert(Array, slice(tensor, :, i, :)))
elseif swapped == [2,3]
pairs[i,:,:] = _corners(convert(Array, slice(tensor, i, :, :)))
end
end
pairs
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment