working on tensor - outer product
This commit is contained in:
parent
ea2b494abb
commit
052c30fd9d
38
t.cc
38
t.cc
@ -3295,7 +3295,7 @@ cout <<eu;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if(1)
|
if(0)
|
||||||
{
|
{
|
||||||
int n=5;
|
int n=5;
|
||||||
INDEXGROUP ag;
|
INDEXGROUP ag;
|
||||||
@ -3385,4 +3385,40 @@ cout <<e;
|
|||||||
cout <<eu;
|
cout <<eu;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(0)
|
||||||
|
{
|
||||||
|
int n=5;
|
||||||
|
INDEXGROUP g;
|
||||||
|
g.number=2;
|
||||||
|
g.symmetry= 1;
|
||||||
|
g.offset=0;
|
||||||
|
g.range=n;
|
||||||
|
|
||||||
|
Tensor<double> e(g);
|
||||||
|
e.randomize(1.);
|
||||||
|
INDEXLIST il(2);
|
||||||
|
il[0]= {0,1};
|
||||||
|
il[1]= {0,0};
|
||||||
|
Tensor<double> eu = e.unwind_indices(il);
|
||||||
|
|
||||||
|
for(int i=0; i<n; ++i)
|
||||||
|
for(int j=0; j<n; ++j)
|
||||||
|
for(int k=0; k<n; ++k)
|
||||||
|
for(int l=0; l<n; ++l)
|
||||||
|
{
|
||||||
|
if(e(i,j)!=eu(j,i)) laerror("error in unwind_indces");
|
||||||
|
}
|
||||||
|
cout <<e;
|
||||||
|
cout <<eu;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(1)
|
||||||
|
{
|
||||||
|
NRVec<double> a({1.,10.,100.});
|
||||||
|
NRVec<double> b({1.,2.,3.});
|
||||||
|
Tensor<double> aa(a);
|
||||||
|
Tensor<double> bb(b);
|
||||||
|
cout << aa*bb;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
13
tensor.cc
13
tensor.cc
@ -726,11 +726,16 @@ for(int i=0; i<il.size(); ++i)
|
|||||||
|
|
||||||
//then the remaining groups with one index removed, if nonempty
|
//then the remaining groups with one index removed, if nonempty
|
||||||
int ii=il.size();
|
int ii=il.size();
|
||||||
|
int emptied_groups=0;
|
||||||
for(int i=0; i<oldshape.size(); ++i)
|
for(int i=0; i<oldshape.size(); ++i)
|
||||||
if(oldshape[i].number>0)
|
if(oldshape[i].number>0)
|
||||||
{
|
{
|
||||||
newshape[ii++] = oldshape[i];
|
newshape[ii++] = oldshape[i];
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
++emptied_groups;
|
||||||
|
|
||||||
|
if(emptied_groups) newshape.resize(newshape.size()-emptied_groups,true);
|
||||||
|
|
||||||
Tensor<T> r(newshape);
|
Tensor<T> r(newshape);
|
||||||
if(r.rank()!=rank()) laerror("internal error 2 in unwind_indces");
|
if(r.rank()!=rank()) laerror("internal error 2 in unwind_indces");
|
||||||
@ -1019,6 +1024,14 @@ return r;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//outer product, rhs indices will be the less significant than this
|
||||||
|
template<typename T>
|
||||||
|
Tensor<T> Tensor<T>::operator*(const Tensor &rhs) const
|
||||||
|
{
|
||||||
|
Tensor<T> r(rhs.shape.concat(shape));
|
||||||
|
r.data= data.otimes2vec(rhs.data);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
4
tensor.h
4
tensor.h
@ -36,9 +36,9 @@
|
|||||||
#include "smat.h"
|
#include "smat.h"
|
||||||
#include "miscfunc.h"
|
#include "miscfunc.h"
|
||||||
|
|
||||||
//@@@todo - outer product
|
|
||||||
//@@@permutation of individual indices??? how to treat the symmetry groups
|
//@@@permutation of individual indices??? how to treat the symmetry groups
|
||||||
//@@@todo - index names and contraction by named index list
|
//@@@todo - index names and contraction by named index list
|
||||||
|
//@@@contraction inside one tensor
|
||||||
|
|
||||||
namespace LA {
|
namespace LA {
|
||||||
|
|
||||||
@ -159,6 +159,8 @@ public:
|
|||||||
inline Tensor& operator/=(const T &a) {data/=a; return *this;};
|
inline Tensor& operator/=(const T &a) {data/=a; return *this;};
|
||||||
inline Tensor operator/(const T &a) const {Tensor r(*this); r /=a; return r;};
|
inline Tensor operator/(const T &a) const {Tensor r(*this); r /=a; return r;};
|
||||||
|
|
||||||
|
Tensor operator*(const Tensor &rhs) const; //outer product
|
||||||
|
|
||||||
Tensor& conjugateme() {data.conjugateme(); return *this;};
|
Tensor& conjugateme() {data.conjugateme(); return *this;};
|
||||||
inline Tensor conjugate() const {Tensor r(*this); r.conjugateme(); return r;};
|
inline Tensor conjugate() const {Tensor r(*this); r.conjugateme(); return r;};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user