template<typename S>
eckit::linalg::Tensor class

Dense Tensor in column major storage order This class is not meant to be accessed 1 element at a time, as its access isn't efficient enough in tight loops. It is meant to be passed as a contiguous piece of data into linear algebra packages. The operator() is only provided for inspection and testing.

Supports 2 memory layouts:

  • Column-major (as in Fortran) where [fast idx] .... [slow idx] - also known as "left" layout
  • Row-major (as in C) where [slow idx] .... [fast idx] - also known as "right" layout

Public types

enum class Layout: int { Right = 0, Left = 1, RowMajor = Right, ColMajor = Left }

Public static functions

static auto flatSize(const std::vector<Size>& shape) -> Size
static auto strides(Layout layout, const std::vector<Size>& shape) -> std::vector<Size>

Constructors, destructors, conversion operators

Tensor(Layout layout = Layout::ColMajor)
Default constructor (empty tensor)
Tensor(const std::vector<Size>& shape, Layout layout = Layout::ColMajor)
Construct tensor with given rows and columns (allocates memory, not initialised)
Tensor(S* array, const std::vector<Size>& shape, Layout layout = Layout::ColMajor)
Construct tensor from existing data (does NOT take ownership)
Tensor(Stream& s)
Constructor from Stream.
Tensor(const Tensor& other)
Copy constructor.
Tensor(Tensor&& other) noexcept
Move constructor.
~Tensor()
Destructor.

Public functions

auto operator=(const Tensor& other) -> Tensor&
auto operator=(Tensor&& other) -> Tensor& noexcept
Move assignment operator.
void swap(Tensor& other)
Swap this tensor with another.
void resize(const std::vector<Size>& shape)
void zero()
Set data to zero.
void fill(S value)
Fill vector with given S.
void encode(Stream& s) const
auto size() const -> Size
auto shape() const -> std::vector<Size>
auto operator[](Size i) -> S&
Access to linearised storage.
auto operator[](Size i) const -> const S&
auto data() -> S*
auto data() const -> const S*
auto begin() -> S*
auto begin() const -> const S*
auto end() -> S*
auto end() const -> const S*
void print(std::ostream& s) const
auto layout() const -> Layout
template<typename... Idx>
auto operator()(Idx... idx) -> S&
Multidimensional index operator A(i,j,k,...)
template<typename... Idx>
auto operator()(Idx... idx) const -> const S&
Multidimensional index operator A(i,j,k,...)
auto transformColMajorToRowMajor() const -> Tensor
Transform a colMajor-layout tensor to rowMajor-layout.
auto transformRowMajorToColMajor() const -> Tensor
Transform a rowMajor-layout tensor to colMajor-layout.

Function documentation

template<typename S>
Tensor& eckit::linalg::Tensor<S>::operator=(const Tensor& other)

Assignment Consistently retains ownership to avoid surprises in ownership behaviour. However, if a resize() triggers reallocation of memory, ownership will be reset.

template<typename S>
void eckit::linalg::Tensor<S>::resize(const std::vector<Size>& shape)

Resize tensor to given a shape Invalidates data if shapes don't match, otherwise keeps data and simply reshapes

template<typename S>
void eckit::linalg::Tensor<S>::encode(Stream& s) const

Serialise to a Stream This serialisation is not cross-platform

template<typename S>
Size eckit::linalg::Tensor<S>::size() const

Returns flatten size (= product of shape vector)

template<typename S>
std::vector<Size> eckit::linalg::Tensor<S>::shape() const

Returns shape

template<typename S>
S* eckit::linalg::Tensor<S>::data()

Returns modifiable view of the data

template<typename S>
const S* eckit::linalg::Tensor<S>::data() const

Returns read-only view of the data

template<typename S>
S* eckit::linalg::Tensor<S>::begin()

Returns iterator to beginning of the data

template<typename S>
const S* eckit::linalg::Tensor<S>::begin() const

Returns const iterator to beginning of the data

template<typename S>
S* eckit::linalg::Tensor<S>::end()

Returns iterator to end of the data

template<typename S>
const S* eckit::linalg::Tensor<S>::end() const

Returns const iterator to end of the data

template<typename S> template<typename... Idx>
S& eckit::linalg::Tensor<S>::operator()(Idx... idx)

Multidimensional index operator A(i,j,k,...)

template<typename S> template<typename... Idx>
const S& eckit::linalg::Tensor<S>::operator()(Idx... idx) const

Multidimensional index operator A(i,j,k,...)