📄 newmat2.cpp
字号:
//$$ newmat2.cpp Matrix row and column operations
// Copyright (C) 1991,2,3,4: R B Davies
#define WANT_MATH
#include "include.h"
#include "newmat.h"
#include "newmatrc.h"
#ifdef use_namespace
namespace NEWMAT {
#endif
#ifdef DO_REPORT
#define REPORT { static ExeCounter ExeCount(__LINE__,2); ++ExeCount; }
#else
#define REPORT {}
#endif
//#define MONITOR(what,storage,store) { cout << what << " " << storage << " at " << (long)store << "\n"; }
#define MONITOR(what,store,storage) {}
/************************** Matrix Row/Col functions ************************/
void MatrixRowCol::Add(const MatrixRowCol& mrc)
{
// THIS += mrc
REPORT
int f = mrc.skip; int l = f + mrc.storage; int lx = skip + storage;
if (f < skip) f = skip; if (l > lx) l = lx; l -= f;
if (l<=0) return;
Real* elx=data+(f-skip); Real* el=mrc.data+(f-mrc.skip);
while (l--) *elx++ += *el++;
}
void MatrixRowCol::AddScaled(const MatrixRowCol& mrc, Real x)
{
REPORT
// THIS += (mrc * x)
int f = mrc.skip; int l = f + mrc.storage; int lx = skip + storage;
if (f < skip) f = skip; if (l > lx) l = lx; l -= f;
if (l<=0) return;
Real* elx=data+(f-skip); Real* el=mrc.data+(f-mrc.skip);
while (l--) *elx++ += *el++ * x;
}
void MatrixRowCol::Sub(const MatrixRowCol& mrc)
{
REPORT
// THIS -= mrc
int f = mrc.skip; int l = f + mrc.storage; int lx = skip + storage;
if (f < skip) f = skip; if (l > lx) l = lx; l -= f;
if (l<=0) return;
Real* elx=data+(f-skip); Real* el=mrc.data+(f-mrc.skip);
while (l--) *elx++ -= *el++;
}
void MatrixRowCol::Inject(const MatrixRowCol& mrc)
// copy stored elements only
{
REPORT
int f = mrc.skip; int l = f + mrc.storage; int lx = skip + storage;
if (f < skip) f = skip; if (l > lx) l = lx; l -= f;
if (l<=0) return;
Real* elx=data+(f-skip); Real* ely=mrc.data+(f-mrc.skip);
while (l--) *elx++ = *ely++;
}
Real DotProd(const MatrixRowCol& mrc1, const MatrixRowCol& mrc2)
{
REPORT // not accessed
int f = mrc1.skip; int f2 = mrc2.skip;
int l = f + mrc1.storage; int l2 = f2 + mrc2.storage;
if (f < f2) f = f2; if (l > l2) l = l2; l -= f;
if (l<=0) return 0.0;
Real* el1=mrc1.data+(f-mrc1.skip); Real* el2=mrc2.data+(f-mrc2.skip);
Real sum = 0.0;
while (l--) sum += *el1++ * *el2++;
return sum;
}
void MatrixRowCol::Add(const MatrixRowCol& mrc1, const MatrixRowCol& mrc2)
{
// THIS = mrc1 + mrc2
int f = skip; int l = skip + storage;
int f1 = mrc1.skip; int l1 = f1 + mrc1.storage;
if (f1<f) f1=f; if (l1>l) l1=l;
int f2 = mrc2.skip; int l2 = f2 + mrc2.storage;
if (f2<f) f2=f; if (l2>l) l2=l;
Real* el = data + (f-skip);
Real* el1 = mrc1.data+(f1-mrc1.skip); Real* el2 = mrc2.data+(f2-mrc2.skip);
if (f1<f2)
{
int i = f1-f; while (i--) *el++ = 0.0;
if (l1<=f2) // disjoint
{
REPORT // not accessed
i = l1-f1; while (i--) *el++ = *el1++;
i = f2-l1; while (i--) *el++ = 0.0;
i = l2-f2; while (i--) *el++ = *el2++;
i = l-l2; while (i--) *el++ = 0.0;
}
else
{
i = f2-f1; while (i--) *el++ = *el1++;
if (l1<=l2)
{
REPORT
i = l1-f2; while (i--) *el++ = *el1++ + *el2++;
i = l2-l1; while (i--) *el++ = *el2++;
i = l-l2; while (i--) *el++ = 0.0;
}
else
{
REPORT
i = l2-f2; while (i--) *el++ = *el1++ + *el2++;
i = l1-l2; while (i--) *el++ = *el1++;
i = l-l1; while (i--) *el++ = 0.0;
}
}
}
else
{
int i = f2-f; while (i--) *el++ = 0.0;
if (l2<=f1) // disjoint
{
REPORT // not accessed
i = l2-f2; while (i--) *el++ = *el2++;
i = f1-l2; while (i--) *el++ = 0.0;
i = l1-f1; while (i--) *el++ = *el1++;
i = l-l1; while (i--) *el++ = 0.0;
}
else
{
i = f1-f2; while (i--) *el++ = *el2++;
if (l2<=l1)
{
REPORT
i = l2-f1; while (i--) *el++ = *el1++ + *el2++;
i = l1-l2; while (i--) *el++ = *el1++;
i = l-l1; while (i--) *el++ = 0.0;
}
else
{
REPORT
i = l1-f1; while (i--) *el++ = *el1++ + *el2++;
i = l2-l1; while (i--) *el++ = *el2++;
i = l-l2; while (i--) *el++ = 0.0;
}
}
}
}
void MatrixRowCol::Sub(const MatrixRowCol& mrc1, const MatrixRowCol& mrc2)
{
// THIS = mrc1 - mrc2
int f = skip; int l = skip + storage;
int f1 = mrc1.skip; int l1 = f1 + mrc1.storage;
if (f1<f) f1=f; if (l1>l) l1=l;
int f2 = mrc2.skip; int l2 = f2 + mrc2.storage;
if (f2<f) f2=f; if (l2>l) l2=l;
Real* el = data + (f-skip);
Real* el1 = mrc1.data+(f1-mrc1.skip); Real* el2 = mrc2.data+(f2-mrc2.skip);
if (f1<f2)
{
int i = f1-f; while (i--) *el++ = 0.0;
if (l1<=f2) // disjoint
{
REPORT // not accessed
i = l1-f1; while (i--) *el++ = *el1++;
i = f2-l1; while (i--) *el++ = 0.0;
i = l2-f2; while (i--) *el++ = - *el2++;
i = l-l2; while (i--) *el++ = 0.0;
}
else
{
i = f2-f1; while (i--) *el++ = *el1++;
if (l1<=l2)
{
REPORT
i = l1-f2; while (i--) *el++ = *el1++ - *el2++;
i = l2-l1; while (i--) *el++ = - *el2++;
i = l-l2; while (i--) *el++ = 0.0;
}
else
{
REPORT
i = l2-f2; while (i--) *el++ = *el1++ - *el2++;
i = l1-l2; while (i--) *el++ = *el1++;
i = l-l1; while (i--) *el++ = 0.0;
}
}
}
else
{
int i = f2-f; while (i--) *el++ = 0.0;
if (l2<=f1) // disjoint
{
REPORT // not accessed
i = l2-f2; while (i--) *el++ = - *el2++;
i = f1-l2; while (i--) *el++ = 0.0;
i = l1-f1; while (i--) *el++ = *el1++;
i = l-l1; while (i--) *el++ = 0.0;
}
else
{
i = f1-f2; while (i--) *el++ = - *el2++;
if (l2<=l1)
{
REPORT
i = l2-f1; while (i--) *el++ = *el1++ - *el2++;
i = l1-l2; while (i--) *el++ = *el1++;
i = l-l1; while (i--) *el++ = 0.0;
}
else
{
REPORT
i = l1-f1; while (i--) *el++ = *el1++ - *el2++;
i = l2-l1; while (i--) *el++ = - *el2++;
i = l-l2; while (i--) *el++ = 0.0;
}
}
}
}
void MatrixRowCol::Add(const MatrixRowCol& mrc1, Real x)
{
// THIS = mrc1 + x
REPORT
if (!storage) return;
int f = mrc1.skip; int l = f + mrc1.storage; int lx = skip + storage;
if (f < skip) { f = skip; if (l < f) l = f; }
if (l > lx) { l = lx; if (f > lx) f = lx; }
Real* elx = data; Real* ely = mrc1.data+(f-mrc1.skip);
int l1 = f-skip; while (l1--) *elx++ = x;
l1 = l-f; while (l1--) *elx++ = *ely++ + x;
lx -= l; while (lx--) *elx++ = x;
}
void MatrixRowCol::NegAdd(const MatrixRowCol& mrc1, Real x)
{
// THIS = x - mrc1
REPORT
if (!storage) return;
int f = mrc1.skip; int l = f + mrc1.storage; int lx = skip + storage;
if (f < skip) { f = skip; if (l < f) l = f; }
if (l > lx) { l = lx; if (f > lx) f = lx; }
Real* elx = data; Real* ely = mrc1.data+(f-mrc1.skip);
int l1 = f-skip; while (l1--) *elx++ = x;
l1 = l-f; while (l1--) *elx++ = x - *ely++;
lx -= l; while (lx--) *elx++ = x;
}
void MatrixRowCol::RevSub(const MatrixRowCol& mrc1)
{
// THIS = mrc - THIS
REPORT
if (!storage) return;
int f = mrc1.skip; int l = f + mrc1.storage; int lx = skip + storage;
if (f < skip) { f = skip; if (l < f) l = f; }
if (l > lx) { l = lx; if (f > lx) f = lx; }
Real* elx = data; Real* ely = mrc1.data+(f-mrc1.skip);
int l1 = f-skip; while (l1--) { *elx = - *elx; elx++; }
l1 = l-f; while (l1--) { *elx = *ely++ - *elx; elx++; }
lx -= l; while (lx--) { *elx = - *elx; elx++; }
}
void MatrixRowCol::ConCat(const MatrixRowCol& mrc1, const MatrixRowCol& mrc2)
{
// THIS = mrc1 | mrc2
REPORT
int f1 = mrc1.skip; int l1 = f1 + mrc1.storage; int lx = skip + storage;
if (f1 < skip) { f1 = skip; if (l1 < f1) l1 = f1; }
if (l1 > lx) { l1 = lx; if (f1 > lx) f1 = lx; }
Real* elx = data;
int i = f1-skip; while (i--) *elx++ =0.0;
i = l1-f1;
if (i) // in case f1 would take ely out of range
{ Real* ely = mrc1.data+(f1-mrc1.skip); while (i--) *elx++ = *ely++; }
int f2 = mrc2.skip; int l2 = f2 + mrc2.storage; i = mrc1.length;
int skipx = l1 - i; lx -= i; // addresses rel to second seg, maybe -ve
if (f2 < skipx) { f2 = skipx; if (l2 < f2) l2 = f2; }
if (l2 > lx) { l2 = lx; if (f2 > lx) f2 = lx; }
i = f2-skipx; while (i--) *elx++ = 0.0;
i = l2-f2;
if (i) // in case f2 would take ely out of range
{ Real* ely = mrc2.data+(f2-mrc2.skip); while (i--) *elx++ = *ely++; }
lx -= l2; while (lx--) *elx++ = 0.0;
}
void MatrixRowCol::Multiply(const MatrixRowCol& mrc1)
// element by element multiply into
{
REPORT
if (!storage) return;
int f = mrc1.skip; int l = f + mrc1.storage; int lx = skip + storage;
if (f < skip) { f = skip; if (l < f) l = f; }
if (l > lx) { l = lx; if (f > lx) f = lx; }
Real* elx = data; Real* ely = mrc1.data+(f-mrc1.skip);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -