📄 uarrtests.cpp
字号:
//---------------------------------------------------------------------------
// N.V.Shokhirev
// created: 20040726
// modified: 20041106
//---------------------------------------------------------------------------
#pragma hdrstop
#include "uArrTests.h"
#include "DynLinAlg.h"
#include "MatUtils.h"
#include "dynarrutils.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
double GetValue(FArr1D& v, int i)
{
return v(i);
};
void SetValue(FArr1D& v, int i, double x)
{
v(i) = x;
};
container::container(int n):v(n),m(n,n) { };
String Lim1DTest()
{
String s = "", ss = "Lim1D Test";
bool fail = false;
Lim1D lim1;
if (lim1.D1() != 1 || lim1.L1() != 1 || lim1.H1() != 1 ) {
fail = true; s += " Default Constr |";
};
lim1.SetL1(0);
if (lim1.D1() != 1 || lim1.L1() != 0 || lim1.H1() != 0 ) {
fail = true; s += " SetL1(0) |";
};
Lim1D lim2(5);
if (lim2.D1() != 5 || lim2.L1() != 1 || lim2.H1() != 5 ) {
fail = true; s += " 1-based Constr |";
};
Lim1D lim3(-2,2);
if (lim3.D1() != 5 || lim3.L1() != -2 || lim3.H1() != 2 ) {
fail = true; s += " General Constr |";
};
if (lim3.eq(lim2) ) { fail = true; s += " eq must fail |"; };
lim2.SetL1(-2);
if (!lim3.eq(lim2) ) { fail = true; s += " eq must not fail |"; };
if (fail) ss += " FAIL:" + s;
else ss += " - OK";
return ss;
};
String Lim2DTest()
{
String s = "", ss = "Lim2D Test";
bool fail = false;
Lim2D lim1;
if (lim1.D1() != 1 || lim1.L1() != 1 || lim1.H1() != 1 ||
lim1.D2() != 1 || lim1.L2() != 1 || lim1.H2() != 1) {
fail = true; s += " Default Constr |";
};
Lim2D lim2(3,4);
if (lim2.D1() != 3 || lim2.L1() != 1 || lim2.H1() != 3 ||
lim2.D2() != 4 || lim2.L2() != 1 || lim2.H2() != 4 ) {
fail = true; s += " 1-based Constr |";
};
Lim2D lim3(-1,1,0,3);
if (lim3.D1() != 3 || lim3.L1() != -1 || lim3.H1() != 1 ||
lim3.D2() != 4 || lim3.L2() != 0 || lim3.H2() != 3) {
fail = true; s += " General Constr |";
};
lim2.SetL1(-1);
lim2.SetL2(0);
if (lim2.D1() != 3 || lim2.L1() != -1 || lim2.H1() != 1 ||
lim2.D2() != 4 || lim2.L2() != 0 || lim2.H2() != 3) {
fail = true; s += " SetL1(-1), SetL2(0) |";
};
if (fail) ss += " FAIL:" + s;
else ss += " - OK";
return ss;
};
String FArr1DTest()
{
String s = "", ss = "FArr1D Test";
bool fail = false;
double x1, x2;
int n = 5;
FArr1D a1(n);
FArr1D a2(n);
FArr1D arr1(n);
FArr1D arr2(n);
RandArr(arr1,-1.0,1.0);
RandArr(arr2,-1.0,1.0);
x1 = arr1 * arr2;
x2 = Dot(arr1, arr2);
if ( ! Equal(x1, x2) ) { fail = true; s += " Dot product |"; };
arr1(2) = 4.44;
arr2 = arr1;
if ( ! Equal(arr1, arr2) ) { fail = true; s += " Assignment |"; };
arr1.swap1(2,4);
double temp = arr2(2);
arr2(2) = arr2(4);
arr2(4) = temp;
if ( ! Equal(arr1, arr2) ) { fail = true; s += " Swap |"; };
a1.fill(0.0);
a2 = arr2 - arr1;
if ( ! Equal(a1, a2) ) { fail = true; s += " Subtraction |"; };
MultArr(arr2, 1.2345);
a1 = 1.2345*arr1;
if (! Equal(a1, arr2) ) { fail = true; s += " Const * FArr1D |"; };
a1 = arr1*1.2345;
if (! Equal(a1, arr2) ) { fail = true; s += " FArr1D * Const |"; };
a1 = arr1 + arr2;
a2 = 2.2345 * arr1;
if ( ! Equal(a1, a2) ) { fail = true; s += " Addition |"; };
if (fail) ss += " FAIL:" + s;
else ss += " - OK";
return ss;
};
String FArr1DTest2()
{
String s = "", ss = "FArr1D Test2";
bool fail = false;
double x1, x2;
int idx;
FArr1D a(-4 , 3);
x1 = -4.0;
for (int i = a.L1(); i <= a.H1(); i++)
{
a(i) = x1;
x1 += 1.0;
};
x1 = a.minval(idx);
if ( ! Equal(x1, -4.0) ) { fail = true; s += " minval |"; };
if ( idx != -4 ) { fail = true; s += " minval ixd |"; };
x1 = a.maxval(idx);
if ( ! Equal(x1, 3.0) ) { fail = true; s += " maxval |"; };
if ( idx != 3 ) { fail = true; s += " maxval ixd |"; };
x1 = a.maxabs(idx);
if ( ! Equal(x1, 4.0) ) { fail = true; s += " maxabs |"; };
if ( idx != -4 ) { fail = true; s += " maxabs ixd |"; };
a.minmax(x1, x2, true);
if ( ! Equal(x1,-4.0) ) { fail = true; s += " minmax min |"; };
if ( ! Equal(x2, 3.0) ) { fail = true; s += " minmax max |"; };
if (fail) ss += " FAIL:" + s;
else ss += " - OK";
return ss;
};
String FArr1DTest3()
{
String s = "", ss = "FArr1D Test3";
bool fail = false;
bool cyclic = true;
double x1, x2;
int i, L, H, D, j;
FArr1D a(-4 , 3);
RandArr(a,-10.0,10.0);
for (int i = a.L1(); i <= a.H1(); i++)
{
x1 = extend(a, i, cyclic);
j = cycle(i, a.L1(), a.H1(), a.D1());
x2 = a(j);
if ( ! Equal(x1, x2) ) { fail = true; s += " cyclic |"; };
};
cyclic = false;
for (int i = -5; i <= 5; i++)
{
x1 = extend(a, i, cyclic);
if ( (i < a.L1()) || (a.H1() < i) )
x2 = 0.0;
else
x2 = a(i);
if ( ! Equal(x1, x2) ) { fail = true; s += " zero |"; };
};
x1 = extend0(a, -4, cyclic); x2 = a(-4);
if ( ! Equal(x1, x2) ) { fail = true; s += " zero0-1 |"; };
x1 = extend0(a, 3, cyclic); x2 = a(3);
if ( ! Equal(x1, x2) ) { fail = true; s += " zero0-2 |"; };
x1 = extend0(a, 0, cyclic); x2 = a(0);
if ( ! Equal(x1, x2) ) { fail = true; s += " zero0-3 |"; };
x1 = extend0(a, -6, cyclic); x2 = 0.0;
if ( ! Equal(x1, x2) ) { fail = true; s += " zero0-4 |"; };
x1 = extend0(a, 4, cyclic); x2 = 0.0;
if ( ! Equal(x1, x2) ) { fail = true; s += " zero0-5 |"; };
cyclic = true;
x1 = extend0(a, -4, cyclic); x2 = a(3);
if ( ! Equal(x1, x2) ) { fail = true; s += " cyclic0-1 |"; };
x1 = extend0(a, 3, cyclic); x2 = a(3);
if ( ! Equal(x1, x2) ) { fail = true; s += " cyclic0-2 |"; };
x1 = extend0(a, 0, cyclic); x2 = a(0);
if ( ! Equal(x1, x2) ) { fail = true; s += " cyclic0-3 |"; };
x1 = extend0(a, -5, cyclic); x2 = a(2);
if ( ! Equal(x1, x2) ) { fail = true; s += " cyclic0-4 |"; };
x1 = extend0(a, 4, cyclic); x2 = a(-3);
if ( ! Equal(x1, x2) ) { fail = true; s += " cyclic0-5 |"; };
x1 = extend0(a, -3, cyclic); x2 = a(-3);
if ( ! Equal(x1, x2) ) { fail = true; s += " cyclic0-6 |"; };
if (fail) ss += " FAIL:" + s;
else ss += " - OK";
return ss;
};
String FArr2DTest()
{
String s = "", ss = "FArr2D Test";
bool fail = false;
double x1, x2;
int n = 3, m = 4;
FArr2D a1(n,m);
FArr2D a2(n,m);
FArr2D arr1(n,m);
FArr2D arr2(n,m);
RandArr(arr1,-1.0,1.0);
RandArr(arr2,-1.0,1.0);
arr2 = arr1;
if ( ! Equal(arr1, arr2) ) { fail = true; s += " Assignment |"; };
a1.fill(0.0);
a2 = arr2 - arr1;
if ( ! Equal(a1, a2) ) { fail = true; s += " Subtraction |"; };
MultArr(arr2, 1.2345);
a1 = 1.2345*arr1;
a2 = arr2 - a1;
if (! Equal(a1, arr2) ) { fail = true; s += " Const * FArr2D |"; };
a1 = arr1*1.2345;
if (! Equal(a1, arr2) ) { fail = true; s += " FArr2D * Const |"; };
a1 = arr1 + arr2;
a2 = 2.2345 * arr1;
if ( ! Equal(a1, a2) ) { fail = true; s += " Addition |"; };
if (fail) ss += " FAIL:" + s;
else ss += " - OK";
return ss;
};
String FArr2DTestSwap()
{
String s = "", ss = "FArr2D Test Swap";
bool fail = false;
double t;
int n = 5, m = 6;
FArr2D a1(n,m);
FArr2D a2(n,m);
RandArr(a1,-1.0,1.0);
a2 = a1;
a1.swap1(2,4);
for (int k = a2.L2(); k<= a2.H2(); k++)
{
t = a2(2,k);
a2(2,k) = a2(4,k);
a2(4,k) =t;
};
if ( ! Equal(a1, a2) ) { fail = true; s += " swap1 |"; };
a1.swap2(2,4);
for (int k = a2.L1(); k<= a2.H1(); k++)
{
t = a2(k,2);
a2(k,2) = a2(k,4);
a2(k,4) =t;
};
if ( ! Equal(a1, a2) ) { fail = true; s += " swap2 |"; };
if (fail) ss += " FAIL:" + s;
else ss += " - OK";
return ss;
};
String FArr1D2DTest()
{
String s = "", ss = "FArr1D2D Test";
bool fail = false;
int i1, i2, n = 3, m = 4;
FArr2D a1(n,m);
FArr1D v1(m);
FArr1D v2(n);
FArr1D u2(n);
RandArr(a1,-1.0,1.0);
RandArr(v1,-1.0,1.0);
u2 = a1 * v1;
v2 = MxV(a1, v1);
if (! Equal(u2, v2) ) { fail = true; s += " FArr2D * FArr1D |"; };
FArr2D a2(m,n);
FArr2D b1(n,n);
FArr2D b2(n,n);
RandArr(a2,-1.0,1.0);
b1 = a1*a2;
b2 = MxM(a1,a2);
if (! Equal(b1, b2) ) { fail = true; s += " FArr2D * FArr2D |"; };
if (fail) ss += " FAIL:" + s;
else ss += " - OK";
return ss;
};
String ObjTest()
{
String s = "", ss = "Obj Test";
bool fail = false;
int i1, i2, n = 3;
FArr2D a1(n,n);
FArr1D v1(n);
RandArr(a1,-1.0,1.0);
RandArr(v1,-1.0,1.0);
container c(n);
c.v = v1;
if (! Equal(c.v, v1) ) { fail = true; s += " FArr1D |"; };
c.m = a1;
if (! Equal(c.m, a1) ) { fail = true; s += " FArr2D |"; };
container* pc = new container(n);
pc->v(1) = 2.0;
pc->m = a1;
delete pc;
if (fail) ss += " FAIL:" + s;
else ss += " - OK";
return ss;
};
String ObjTest2()
{
String s = "", ss = "Obj Test 2";
bool fail = false;
int i1 = 2, n = 3;
double x1, x2;
FArr1D v1(n);
x1 = 1.0/3.0;
v1(i1) = x1;
x2 = GetValue(v1, i1);
if (! Equal(x1, x2) ) { fail = true; s += " GetValue |"; };
v1(i1) = 0.0;
SetValue(v1, i1, x1);
if (! Equal(x1, v1(i1) ) ) { fail = true; s += " SetValue |"; };
x2 = GetValue(v1, i1);
if (! Equal(x1, x2) ) { fail = true; s += " Set/Get Value |"; };
if (fail) ss += " FAIL:" + s;
else ss += " - OK";
return ss;
};
String MiscTests()
{
FArr2D a2, a3;
String s = "", ss = "MiscTests";
bool fail = false;
int m = 2, n = 3;
FArr2D a1(n,m);
RandArr(a1,-1.0,1.0);
a2 = MT(a1);
a3 = MT(a2);
if (! Equal(a3, a1) ) { fail = true; s += " ( a^T )^T |"; };
double y;
y = sign( 2.2, 3.3);
if (! Equal( 2.2, y) ) { fail = true; s += " sign(2.2,3.3) |"; };
y = sign(-2.2, 3.3);
if (! Equal( 2.2, y) ) { fail = true; s += " sign(-2.2,3.3) |"; };
y = sign( 2.2,-3.3);
if (! Equal(-2.2, y) ) { fail = true; s += " sign(2.2,-3.3) |"; };
y = sign(-2.2,-3.3);
if (! Equal(-2.2, y) ) { fail = true; s += " sign(-2.2,-3.3) |"; };
y = max1(-2.2,3.3);
if (! Equal(3.3, y) ) { fail = true; s += " max1(-2.2,3.3) |"; };
y = min1(-2.2,3.3);
if (! Equal(-2.2, y) ) { fail = true; s += " min1(-2.2,3.3) |"; };
if (fail) ss += " FAIL:" + s;
else ss += " - OK";
return ss;
};
String IArr1DTest()
{
String s = "", ss = "IArr1D Test";
bool fail = false;
int n = 5;
IArr1D a1(n);
IArr1D a2(n);
// IArr1D arr1(n);
// IArr1D arr2(n);
RandArr(a1,-9,9);
a1(2) = 11;
a2 = a1;
if ( ! Equal(a1, a2) ) { fail = true; s += " Assignment |"; };
a1.swap1(2,4);
int temp = a2(2);
a2(2) = a2(4);
a2(4) = temp;
if ( ! Equal(a1, a2) ) { fail = true; s += " Swap |"; };
if (fail) ss += " FAIL:" + s;
else ss += " - OK";
return ss;
};
/*
String LinAlgTest()
{
String s = "", ss = "LinAlg Test";
bool fail = false;
int n = 5;
FArr1D a(n);
FArr1D b(n);
FArr1D c(n);
FArr1D d(n);
FArr1D e(n);
a.fill(-1.0);
b.fill(-2.0);
d.fill(4.0);
for(int i =1; i<=n;i++) e(i) = double(i);
for(int i =1; i<=n;i++) c(i) = double(i+1); c(5) = 12.0;
strid(b, d, a, c);
if ( ! Equal(c, e) ) { fail = true; s += " strid |"; };
FArr2D m(n,n+1);
for(int i =1; i<=n;i++) { m(i,i) = 4.0; m(i,n+1) = double(i+1); };
m(5,6) = 12.0;
for(int i =1; i< n;i++) {m(i,i+1) = -1.0; m(i+1,i) = -2.0;};
fail = !GaussD(m);
if (fail) {s += " GaussD-singular |"; };
for(int i =1; i<=n;i++) c(i) = m(i,n+1);
if ( ! Equal(c, e) ) { fail = true; s += " GaussD |"; };
for(int i =1; i<=n;i++) { m(i,i) = 4.0; m(i,n+1) = double(i+1); };
m(5,6) = 12.0;
for(int i =1; i< n;i++) {m(i,i+1) = -1.0; m(i+1,i) = -2.0;};
fail = !GaussP(m);
if (fail) {s += " GaussP-singular |"; };
for(int i =1; i<=n;i++) c(i) = m(i,n+1);
if ( ! Equal(c, e) ) { fail = true; s += " GaussP |"; };
FArr2D q(n,n);
int err;
double x = 0.1;
for(int i =1; i<=n;i++)
{ q(i,i) = 4.0; b(i) = double(i+1); c(i) = e(i) + x; x = -x; };
b(5) = 12.0;
for(int i =1; i< n;i++) {q(i,i+1) = -1.0; q(i+1,i) = -2.0;};
JacobiIter(q, c, b, 1.0e-6, err);
if ( ! Equal(c, e,1.1e-6) ) { fail = true; s += " JacobiIter |"; };
FArr1D r(n);
x = 0.1;
for(int i =1; i<=n;i++)
{ q(i,i) = 4.0; b(i) = double(i+1); c(i) = e(i) + x; x = -x; };
b(5) = 12.0;
c.fill(0.0);
for(int i =1; i< n;i++) {q(i,i+1) = -1.0; q(i+1,i) = -2.0;};
fail = !ConjGrad(q, b, c, 1.0e-8);
if (fail) {s += " ConjGrad: Iter > IterMax |"; };
if ( ! Equal(c, e,1.1e-4) ) { fail = true; s += " ConjGrad |"; };
if (fail) ss += " FAIL:" + s;
else ss += " - OK";
return ss;
};
*/
String FArr3DTest()
{
String s = "", ss = "FArr3D Test";
bool fail = false;
double x1, x2;
int d1 = 5, d2 = 3, d3 = 4;
FArr3D a3(d1,d2,d3);
FArr3D a33(d1,d2,d3);
FArr2D a22(d2,d3);
FArr2D a2(d2,d3);
for(int i1=1; i1<=d1; i1++)
{
RandArr(a2,-1.0,1.0);
a3.SetFArr2D(i1,a2);
a3.GetFArr2D(i1,a22);
if ( ! Equal(a22, a2) ) { fail = true; s.cat_sprintf(" Get/Set i= %d", i1); };
};
x1 = 1.23456789;
a3(4,2,3) = x1;
x2 = a3(4,2,3);
if ( ! Equal(x1, x2) ) { fail = true; s.cat_sprintf(" Element"); };
a33 = a3;
for(int i1=1; i1<=d1; i1++)
{
a33.GetFArr2D(i1,a22);
a3.GetFArr2D(i1,a2);
if ( ! Equal(a22, a2) ) { fail = true; s.cat_sprintf(" Assign i= %d", i1); };
};
if (fail) ss += " FAIL:" + s;
else ss += " - OK";
return ss;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -