Class tensor (o2scl)¶
-
template<class
data_t
= double, classvec_t
= std::vector<data_t>, classvec_size_t
= std::vector<size_t>>
classo2scl
::
tensor
¶ Tensor class with arbitrary dimensions.
The elements of a tensor are typically specified as a list of
size_t
numbers with length equal to the tensor rank. For a rank-4 tensor namedt
, the elementt[1][2][0][3]
can be obtained with something similar tosize_t ix[4]={1,2,0,3}; double x=t.get(ix);
Empty tensors have zero rank.
The type
vec_t
can be any vector type withoperator[]
,size()
andresize()
methods. The typevec_size_t
can be any integer-like vector type withoperator[]
,size()
andresize()
methods.For I/O with tensors, see o2scl_hdf::hdf_file::setd_ten() and o2scl_hdf::hdf_file::getd_ten() . See also the discussion in the sections tensor_subsect and vec_io_cont_subsect of the user’s guide.
The storage pattern is a generalization of row-major order. In the case of a 4-rank tensor, the location of a generic element is
\[ \left( \left( i_0 s_1 + i_1 \right) s_2 + i_2 \right) s_3 + i_3 \, . \]In this case the distance between two elements \((i_0,i_1, i_2,i_3)\) and \( (i_0+1,i_1,i_2,i_3) \) is \( s_1 s_2 s_3 \), the distance between two elements \((i_0,i_1,i_2, i_3)\) and \( (i_0,i_1+1,i_2,i_3) \) is \( s_2 s_3 \), and the elements \((i_0,i_1,i_2,i_3)\) and \( (i_0,i_1,i_2,i_3+1) \) are adjacent.- Idea for Future:
Create an operator[] for tensor and not just tensor1?
- Note
Slices of tensors are subsets obtained from fixing the index of several dimensions, while letting other dimensions vary. For a slice with one dimension not fixed, see vector_slice(). The o2scl::tensor::vector_slice() function should clearly work for uBlas vectors, and seems to work with std::vector objects also, but latter use has not been fully tested.
- Idea for Future:
Could implement arithmetic operators + and - and some different products.
- Idea for Future:
Implement copies to and from vector and matrices
- Idea for Future:
Implement tensor contractions, i.e. tensor = tensor * tensor
- Idea for Future:
Could be interesting to write an iterator for this class.
Method to check for valid object
-
void
is_valid
() const¶ Check that the o2scl::tensor object is valid.
Copy constructors
-
tensor
(const tensor<data_t, vec_t, vec_size_t> &t)¶ Copy using
operator()
-
tensor<data_t, vec_t, vec_size_t> &
operator=
(const tensor<data_t, vec_t, vec_size_t> &t)¶ Copy using
operator=()
Clear method
-
void
clear
()¶ Clear the tensor of all data and free allocated memory.
Set functions
-
template<class
size_vec_t
>
voidset
(const size_vec_t &index, data_t val)¶ Set the element indexed by
index
to valueval
.
Get functions
-
typedef boost::numeric::ublas::slice
slice
¶
-
template<class
size_vec_t
>
data_t &get
(const size_vec_t &index)¶ Get the element indexed by
index
.
-
template<class
size_vec_t
>
data_t const &get
(const size_vec_t &index) const¶ Get a const reference to the element indexed by
index
.
Slice function
-
template<class
size_vec_t
>
ubvector_slicevector_slice
(size_t ix, const size_vec_t &index)¶ Fix all but one index to create a vector.
This fixes all of the indices to the values given in
index
except for the index numberix
, and returns the corresponding vector, whose length is equal to the size of the tensor in that index. The valueindex[ix]
is ignored.For example, for a rank 3 tensor allocated with
the following codetensor t; size_t dim[3]={3,4,5}; t.resize(3,dim);
Gives a vectorsize_t index[3]={1,0,3}; ubvector_view v=t.vector_slice(1,index);
v
of length 4 which refers to the valuest(1,0,3)
,t(1,1,3)
,t(1,2,3)
, andt(1,3,3)
.
Resize method
-
template<class
size_vec_t
>
voidresize
(size_t rank, const size_vec_t &dim)¶ Resize the tensor to rank
rank
with sizes given indim
.The parameter
dim
must be a vector of sizes with a length equal torank
. This resize method is always destructive.If the user requests any of the sizes to be zero, this function will call the error handler.
Size functions
-
size_t
get_rank
() const¶ Return the rank of the tensor.
-
size_t
get_size
(size_t i) const¶ Returns the size of the ith index.
-
const vec_size_t &
get_size_arr
() const¶ Return the full vector of sizes.
-
size_t
total_size
() const¶ Returns the size of the tensor (the product of the sizes over every index)
Index manipulation
-
template<class
size_vec_t
>
size_tpack_indices
(const size_vec_t &index)¶ Pack the indices into a single vector index.
-
template<class
size_vec_t
>
voidunpack_index
(size_t ix, size_vec_t &index)¶ Unpack the single vector index into indices.
Minimum, maximum, and sum
-
void
min_index
(vec_size_t &index)¶ Compute the index of the minimum value in the tensor.
-
void
min
(vec_size_t &index, data_t &val)¶ Compute the index of the minimum value in the tensor and return the minimum.
-
void
max_index
(vec_size_t &index)¶ Compute the index of the maximum value in the tensor.
-
void
max
(vec_size_t &index, data_t &val)¶ Compute the index and value of the maximum value in the tensor and return the maximum.
-
void
minmax_index
(vec_size_t &index_min, vec_size_t &index_max)¶ Compute the indices of the minimum and maximum values in the tensor.
-
void
minmax
(vec_size_t &index, size_t &index_min, data_t &min, size_t &index_max, data_t &max)¶ Compute the indices and values of the maximum and minimum in the tensor.
-
double
total_sum
() const¶ Return the sum over every element in the tensor.
Slicing and converting to table3d objects
-
void
convert_table3d_sum
(size_t ix_x, size_t ix_y, table3d &tab, std::string x_name = "x", std::string y_name = "y", std::string slice_name = "z")¶ Convert to a o2scl::table3d object by summing over all but two indices.
-
tensor<data_t>
rearrange_and_copy
(std::vector<index_spec> spec, int verbose = 0, bool err_on_fail = true)¶ Rearrange, sum and copy current tensor to a new tensor.
- Idea for Future:
Return a scalar if possible as a rank 1 tensor with 1 element.
Public Functions
-
tensor
()¶ Create an empty tensor with zero rank.
-
template<class
size_vec_t
>tensor
(size_t rank, const size_vec_t &dim)¶ Create a tensor of rank
rank
with sizes given indim
.The parameter
dim
must be a pointer to a vector of sizes with lengthrank
. If the user requests any of the sizes to be zero, this constructor will call the error handler, create an empty tensor, and will allocate no memory.
-
~tensor
()¶
Protected Attributes
-
vec_size_t
size
¶ A rank-sized vector of the sizes of each dimension.
-
size_t
rk
¶ Rank.