![]() |
Object-oriented Scientific Computing Library: Version 0.910
|
Tensor class with arbitrary dimensions. More...
#include <tensor.h>
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 named t
, the element t[1][2][0][3]
can be obtained with something similar to
size_t ix[4]={1,2,0,3}; double x=t.get(ix);
Empty tensors have zero rank.
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(). For a slice with two dimensions not fixed, see matrix_slice().
For I/O with tensors, see hdf_io.h .
value_t
.Public Member 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 in dim . | |
Set functions | |
template<class size_vec_t > | |
void | set (const size_vec_t &index, double val) |
Set the element indexed by index to value val . | |
void | set_all (double x) |
Set all elements in a tensor to some fixed value. | |
Get functions | |
template<class size_vec_t > | |
double & | get (const size_vec_t &index) |
Get the element indexed by index . | |
template<class size_vec_t > | |
double const & | get (const size_vec_t &index) const |
Get a const reference to the element indexed by index . | |
Slice functions | |
template<class size_vec_t > | |
ovector_array_stride | vector_slice (size_t ix, const size_vec_t &index) |
Fix all but one index to create a vector. | |
template<class size_vec_t > | |
omatrix_array | matrix_slice (size_t ix, const size_vec_t &index) |
Fix all but two indices to create a matrix. | |
Memory allocation | |
template<class size_vec_t > | |
void | allocate (size_t rank, const size_vec_t &dim) |
Allocate space for a tensor of rank rank with sizes given in dim . | |
void | free () |
Free allocated space (also sets rank to zero) | |
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 uvector_size_t & | get_size_arr () const |
Return the full array of sizes. | |
const uvector & | get_data () const |
Return the full array 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_t | pack_indices (const size_vec_t &index) |
Pack the indices into a single array index. | |
template<class size_vec_t > | |
void | unpack_indices (size_t ix, size_vec_t &index) |
Unpack the single array index into indices. | |
Protected Attributes | |
uvector | data |
The data. | |
uvector_size_t | size |
A rank-sized array of the sizes of each dimension. | |
size_t | rk |
Rank. |
tensor::tensor | ( | size_t | rank, |
const size_vec_t & | dim | ||
) | [inline] |
ovector_array_stride tensor::vector_slice | ( | size_t | ix, |
const size_vec_t & | index | ||
) | [inline] |
This fixes all of the indices to the values given in index
except for the index number ix
, and returns the corresponding vector, whose length is equal to the size of the tensor in that index. The value index[ix]
is ignored.
For example, for a rank 3 tensor allocated with
the following code
size_t index[3]={1,0,3}; ovector_view v=t.vector_slice(1,index);
Gives a vector v
of length 4 which refers to the values t(1,0,3)
, t(1,1,3)
, t(1,2,3)
, and t(1,3,3)
.
omatrix_array tensor::matrix_slice | ( | size_t | ix, |
const size_vec_t & | index | ||
) | [inline] |
This fixes all of the indices to the values given in index
except for the index number ix
and the last index, and returns the corresponding matrix, whose size is equal to the size of the tensor in the two indices which are not fixed.
Since the last index is always fixed, the parameter ix
is limited to be .
void tensor::allocate | ( | size_t | rank, |
const size_vec_t & | dim | ||
) | [inline] |
The parameter dim
must be a pointer to an array of sizes with length rank
.
If memory was previously allocated, it will be freed before the new allocation.
If the user requests any of the sizes to be zero, this function will call the error handler and will allocate no memory. If memory was previously allocated, the tensor is left unmodified and no deallocation is performed.
Reimplemented in tensor_grid.
Documentation generated with Doxygen. Provided under the GNU Free Documentation License (see License Information).