19 int mndspr(
const char*,
unsigned int,
double,
const double*,
int,
double*);
21 LASymMatrix::LASymMatrix(
const ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, double>,
double>,
double>& out) : fSize(0), fNRow(0), fData(0) {
24 fNRow = out.Obj().Obj().Obj().size();
25 fSize = fNRow*(fNRow+1)/2;
26 fData = (
double*)StackAllocatorHolder::Get().Allocate(
sizeof(
double)*fSize);
27 memset(fData, 0, fSize*
sizeof(
double));
28 Outer_prod(*
this, out.Obj().Obj().Obj(), out.f()*out.Obj().Obj().f()*out.Obj().Obj().f());
31 LASymMatrix& LASymMatrix::operator=(
const ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, double>,
double>,
double>& out) {
34 if(fSize == 0 && fData == 0) {
35 fNRow = out.Obj().Obj().Obj().size();
36 fSize = fNRow*(fNRow+1)/2;
37 fData = (
double*)StackAllocatorHolder::Get().Allocate(
sizeof(
double)*fSize);
38 memset(fData, 0, fSize*
sizeof(
double));
39 Outer_prod(*
this, out.Obj().Obj().Obj(), out.f()*out.Obj().Obj().f()*out.Obj().Obj().f());
41 LASymMatrix tmp(out.Obj().Obj().Obj().size());
42 Outer_prod(tmp, out.Obj().Obj().Obj());
43 tmp *= double(out.f()*out.Obj().Obj().f()*out.Obj().Obj().f());
44 assert(fSize == tmp.size());
45 memcpy(fData, tmp.Data(), fSize*
sizeof(double));
50 void Outer_prod(LASymMatrix& A,
const LAVector& v,
double f) {
52 mndspr(
"U", v.size(), f, v.Data(), 1, A.Data());