<!-- Download Links -->

## Introduction

The `Tensor`

class was written in 1997 during my study of templates
(I found it examining my archives).

But I've not seen any such classes since. So I think it can be useful for students. The main reason I've wrote
it - for the convolution of tensors with any dimensionality. Also you can get and use any sub-tensor using
`operator[]`

, for example can be written like

Tensor2 qq,a1,a2,aa;
convolution(aa["li"],a2["lj"],qq["ij"]);
convolution(qq["kl"],a1["ki"],aa["li"]);

## Using

The demo project shows usage of tensors. You can:

Declare and init tensors (you should specify dimension and indexes range).

Tensor2 result2(2);
Tensor4 tt(3); // 4 - dimensions indexes can be 0-2 or "1"-"3"
Tensor2 t1(2); t1[0][0] = 1.0;
t1[1][0] = 2.0;
t1[0][1] = 3.0;
t1[1][1] = 4.0;

Convolute tensors - note that you can use different dimensions and one or more
constants in indices.

convolution(result5["2i"],t3["2"],t2["i3"]);
convolution(result6["ij"],t1["ja"],t2["ai"]);

Use some arithmetical operations.

result3 = t1 + t2*2;

Print part or whole tensor.

t4["ijkl"].printf(std::cout);
result5["1j"].printf(std::cout);

Average tensors.

Tensor2 t[2];
double q[2];
t2.averaging(&t[0],q,2);

Invert 4-dimension tensor with indexes (0,1).

Tensor4 t(2),ti(2);
ti = inverse(t);

## To Do list

It can be easy to implement some more operations with tensors (different multiplication and so).
Please let me know, if you need some.

## Note

Make sure to check out the my web site which is more likely to have updates and betas:
http://www.zmike.net