tensor(3)
NAME
tensor - a N*N tensor, N=1,2,3
SYNOPSYS
The tensor class defines a 3*3 tensor, as the value of a tensorial valued field. Basic algebra with scalars, vectors of R^3 (i.e. the point
class) and tensor objects are supported.
IMPLEMENTATION
- class tensor {
- public:
typedef size_t size_type;
typedef Float element_type; - // allocators:
tensor (const Float& init_val = 0);
tensor (Float x[3][3]);
tensor (const tensor& a);- // affectation:
tensor& operator = (const tensor& a);
tensor& operator = (const Float& val);- // modifiers:
void fill (const Float& init_val);
void reset ();
void set_row (const point& r, size_t i, size_t d = 3);
void set_column (const point& c, size_t j, size_t d = 3);- // accessors:
Float& operator()(size_type i, size_type j);
Float operator()(size_type i, size_type j) const;
point row(size_type i) const;
point col(size_type i) const;
size_t nrow() const; // = 3, for template matrix compatibility size_t ncol() const;- // inputs/outputs:
friend std::istream& operator >> (std::istream& in, tensor& a);
friend std::ostream& operator << (std::ostream& out, const tensor& a);
std::ostream& put (std::ostream& s, size_type d = 3) const;- // algebra:
friend bool operator == (const tensor&, const tensor&);
friend tensor operator - (const tensor&);
friend tensor operator + (const tensor&, const tensor&);
friend tensor operator - (const tensor&, const tensor&);
friend tensor operator * (Float, const tensor&);
friend tensor operator * (const tensor& a, Float k);
friend tensor operator / (const tensor& a, Float k);
friend point operator * (const tensor& a, const point& x);
friend point operator * (const point& yt, const tensor& a);point trans_mult (const point& x) const;- friend tensor trans (const tensor& a, size_type d = 3);
friend tensor operator * (const tensor& a, const tensor& b);
friend tensor inv (const tensor& a, size_type d = 3);
friend tensor diag (const point& d); - // metric and geometric transformations:
friend Float dotdot (const tensor&, const tensor&);
friend Float norm2 (const tensor& a) { return dotdot(a,a); }
friend Float dist2 (const tensor& a, const tensor& b) { return norm2(a-b); } friend Float norm (const tensor& a) { return sqrt(norm2(a)); } friend Float dist (const tensor& a, const tensor& b) { return norm(a-b); } Float determinant (size_type d = 3) const;
friend Float determinant (const tensor& A, size_t d = 3);
friend bool invert_3x3 (const tensor& A, tensor& result);- // spectral:
- // eigenvalues & eigenvectors:
// a = q*d*q^T
// a may be symmetric
// where q=(q1,q2,q3) are eigenvectors in rows (othonormal matrix) // and d=(d1,d2,d3) are eigenvalues, sorted in decreasing order d1 >= d2 >= d3 // return d
point eig (tensor& q, size_t dim = 3) const;
point eig (size_t dim = 3) const; - // singular value decomposition:
// a = u*s*v^T
// a can be unsymmetric
// where u=(u1,u2,u3) are left pseudo-eigenvectors in rows (othonormal matrix) // v=(v1,v2,v3) are right pseudo-eigenvectors in rows (othonormal matrix) // and s=(s1,s2,s3) are eigenvalues, sorted in decreasing order s1 >= s2 >= s3 // return s
point svd (tensor& u, tensor& v, size_t dim = 3) const; - // data:
- Float _x[3][3];
- // internal:
- std::istream& get (std::istream&);
- };
// t = a otimes b
tensor otimes (const point& a, const point& b, size_t na = 3);
// t += a otimes b
void cumul_otimes (tensor& t, const point& a, const point& b, size_t na = 3);
void cumul_otimes (tensor& t, const point& a, const point& b, size_t na, size_t nb);