doubmat.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 1,541 行 · 第 1/3 页
C
1,541 行
#include "doubMat.h"
doubleMatrix doubleArray::operator - () const {
double* newX = new double [M*N];
double* t = newX;
double* u = X;
double* v = X;
do {
while (u < v + N)
*t++ = -(*u++);
} while ((u = v += L) < &X[M*L]);
return doubleMatrix(M, N, newX);
}
doubleMatrix operator * (const double& a, const doubleArray& b) {
double* newx = new double [b.m()*b.n()];
double* t = newx;
double* u = b.x();
double* v = b.x() + b.n();
do {
while (u < v)
*t++ = a * *u++;
u += b.l() - b.n();
} while ((v += b.l()) <= &b.x()[b.m()*b.l()]);
return doubleMatrix(b.m(), b.n(), newx);
}
doubleMatrix operator * (const doubleArray& a, const double& b) {
double* newx = new double [a.m()*a.n()];
double* t = newx;
double* u = a.x();
double* v = a.x() + a.n();
do {
while (u < v)
*t++ = *u++ * b;
u += a.l() - a.n();
} while ((v += a.l()) <= &a.x()[a.m()*a.l()]);
return doubleMatrix(a.m(), a.n(), newx);
}
doubleMatrix operator * (const doubleArray& a, const doubleArray& b) {
if (a.n() == b.n()) {
if (a.m() == b.m()) { // a.n() == b.n()
double* newx = new double [b.m()*b.n()];
double* s = newx;
double* t = newx;
double* u = a.x();
double* v = b.x();
while ((t += b.n()) <= &newx[b.m()*b.n()]) {
while (s < t)
*s++ = *u++ * *v++;
u += a.l() - a.n();
v += b.l() - b.n();
};
return doubleMatrix(b.m(), b.n(), newx);
};
if (a.m() == 1) { // a.n() == b.n() && a.m() != b.m()
double* newx = new double [b.m()*b.n()];
double* s = newx;
double* t = newx;
double* v = b.x();
while ((t += b.n()) <= &newx[b.m()*b.n()]) {
double* u = a.x();
while (s < t)
*s++ = *u++ * *v++;
v += b.l() - b.n();
};
return doubleMatrix(b.m(), b.n(), newx);
};
if (b.m() == 1) { // a.n() == b.n() && a.m() != b.m() && a.m() != 1
double* newx = new double [a.m()*a.n()];
double* s = newx;
double* t = newx;
double* u = a.x();
while ((t += a.n()) <= &newx[a.m()*a.n()]) {
double* v = b.x();
while (s < t)
*s++ = *u++ * *v++;
u += a.l() - a.n();
};
return doubleMatrix(a.m(), a.n(), newx);
};
};
if (a.n() == 1) { // b.n() != a.n()
if (a.m() == b.m()) { // b.n() != a.n() == 1
double* newx = new double [b.m()*b.n()];
double* s = newx;
double* t = newx;
double* u = a.x();
double* v = b.x();
while ((t += b.n()) <= &newx[b.m()*b.n()]) {
while (s < t)
*s++ = *u * *v++;
u++;
v += b.l() - b.n();
};
return doubleMatrix(b.m(), b.n(), newx);
};
if (a.m() == 1) { // b.n() != a.n() == 1 && a.m() != b.m()
double* newx = new double [b.m()*b.n()];
double* s = newx;
double* t = newx;
double* u = a.x();
double* v = b.x();
while ((t += b.n()) <= &newx[b.m()*b.n()]) {
while (s < t)
*s++ = *u * *v++;
v += b.l() - b.n();
};
return doubleMatrix(b.m(), b.n(), newx);
};
};
if (b.n() == 1) { // a.n() != b.n() && a.n() != 1
if (a.m() == b.m()) { // a.n() != b.n() == 1
double* newx = new double [a.m()*a.n()];
double* s = newx;
double* t = newx;
double* u = a.x();
double* v = b.x();
while ((t += a.n()) <= &newx[a.m()*a.n()]) {
while (s < t)
*s++ = *u++ * *v;
u += a.l() - a.n();
v++;
};
return doubleMatrix(a.m(), a.n(), newx);
};
if (b.m() == 1) { // a.n() != b.n() == 1 && a.m() != b.m()
double* newx = new double [a.m()*a.n()];
double* s = newx;
double* t = newx;
double* u = a.x();
double* v = b.x();
while ((t += a.n()) <= &newx[a.m()*a.n()]) {
while (s < t)
*s++ = *u++ * *v;
u += a.l() - a.n();
};
return doubleMatrix(a.m(), a.n(), newx);
};
};
a.error("nonconformant doubleArray * operands.");
return doubleMatrix();
}
doubleMatrix operator / (const double& a, const doubleArray& b) {
double* newx = new double [b.m()*b.n()];
double* t = newx;
double* u = b.x();
double* v = b.x() + b.n();
do {
while (u < v)
*t++ = a / *u++;
u += b.l() - b.n();
} while ((v += b.l()) <= &b.x()[b.m()*b.l()]);
return doubleMatrix(b.m(), b.n(), newx);
}
doubleMatrix operator / (const doubleArray& a, const double& b) {
double* newx = new double [a.m()*a.n()];
double* t = newx;
double* u = a.x();
double* v = a.x() + a.n();
do {
while (u < v)
*t++ = *u++ / b;
u += a.l() - a.n();
} while ((v += a.l()) <= &a.x()[a.m()*a.l()]);
return doubleMatrix(a.m(), a.n(), newx);
}
doubleMatrix operator / (const doubleArray& a, const doubleArray& b) {
if (a.n() == b.n()) {
if (a.m() == b.m()) { // a.n() == b.n()
double* newx = new double [b.m()*b.n()];
double* s = newx;
double* t = newx;
double* u = a.x();
double* v = b.x();
while ((t += b.n()) <= &newx[b.m()*b.n()]) {
while (s < t)
*s++ = *u++ / *v++;
u += a.l() - a.n();
v += b.l() - b.n();
};
return doubleMatrix(b.m(), b.n(), newx);
};
if (a.m() == 1) { // a.n() == b.n() && a.m() != b.m()
double* newx = new double [b.m()*b.n()];
double* s = newx;
double* t = newx;
double* v = b.x();
while ((t += b.n()) <= &newx[b.m()*b.n()]) {
double* u = a.x();
while (s < t)
*s++ = *u++ / *v++;
v += b.l() - b.n();
};
return doubleMatrix(b.m(), b.n(), newx);
};
if (b.m() == 1) { // a.n() == b.n() && a.m() != b.m() && a.m() != 1
double* newx = new double [a.m()*a.n()];
double* s = newx;
double* t = newx;
double* u = a.x();
while ((t += a.n()) <= &newx[a.m()*a.n()]) {
double* v = b.x();
while (s < t)
*s++ = *u++ / *v++;
u += a.l() - a.n();
};
return doubleMatrix(a.m(), a.n(), newx);
};
};
if (a.n() == 1) { // b.n() != a.n()
if (a.m() == b.m()) { // b.n() != a.n() == 1
double* newx = new double [b.m()*b.n()];
double* s = newx;
double* t = newx;
double* u = a.x();
double* v = b.x();
while ((t += b.n()) <= &newx[b.m()*b.n()]) {
while (s < t)
*s++ = *u / *v++;
u++;
v += b.l() - b.n();
};
return doubleMatrix(b.m(), b.n(), newx);
};
if (a.m() == 1) { // b.n() != a.n() == 1 && a.m() != b.m()
double* newx = new double [b.m()*b.n()];
double* s = newx;
double* t = newx;
double* u = a.x();
double* v = b.x();
while ((t += b.n()) <= &newx[b.m()*b.n()]) {
while (s < t)
*s++ = *u / *v++;
v += b.l() - b.n();
};
return doubleMatrix(b.m(), b.n(), newx);
};
};
if (b.n() == 1) { // a.n() != b.n() && a.n() != 1
if (a.m() == b.m()) { // a.n() != b.n() == 1
double* newx = new double [a.m()*a.n()];
double* s = newx;
double* t = newx;
double* u = a.x();
double* v = b.x();
while ((t += a.n()) <= &newx[a.m()*a.n()]) {
while (s < t)
*s++ = *u++ / *v;
u += a.l() - a.n();
v++;
};
return doubleMatrix(a.m(), a.n(), newx);
};
if (b.m() == 1) { // a.n() != b.n() == 1 && a.m() != b.m()
double* newx = new double [a.m()*a.n()];
double* s = newx;
double* t = newx;
double* u = a.x();
double* v = b.x();
while ((t += a.n()) <= &newx[a.m()*a.n()]) {
while (s < t)
*s++ = *u++ / *v;
u += a.l() - a.n();
};
return doubleMatrix(a.m(), a.n(), newx);
};
};
a.error("nonconformant doubleArray / operands.");
return doubleMatrix();
}
doubleMatrix operator % (const doubleArray& a, const doubleArray& b) { // inner product
if (a.n() != b.n())
a.error("nonconformant doubleArray % operands.");
double* newx = new double [a.m()*b.m()];
double* s = newx;
double* t = a.x();
double* u;
double* v;
do {
v = b.x();
while (v < &b.x()[b.m()*b.l()]) {
u = t; *s = *u++ * *v++;
while (u < t + a.n())
*s += *u++ * *v++;
++s;
v += b.l() - b.n();
};
} while((t += a.l()) < &a.x()[a.m()*a.l()]);
return doubleMatrix(a.m(), b.m(), newx);
}
doubleMatrix operator + (const double& a, const doubleArray& b) {
double* newx = new double [b.m()*b.n()];
double* t = newx;
double* u = b.x();
double* v = b.x() + b.n();
do {
while (u < v)
*t++ = a + *u++;
u += b.l() - b.n();
} while ((v += b.l()) <= &b.x()[b.m()*b.l()]);
return doubleMatrix(b.m(), b.n(), newx);
}
doubleMatrix operator + (const doubleArray& a, const double& b) {
double* newx = new double [a.m()*a.n()];
double* t = newx;
double* u = a.x();
double* v = a.x() + a.n();
do {
while (u < v)
*t++ = *u++ + b;
u += a.l() - a.n();
} while ((v += a.l()) <= &a.x()[a.m()*a.l()]);
return doubleMatrix(a.m(), a.n(), newx);
}
doubleMatrix operator + (const doubleArray& a, const doubleArray& b) {
if (a.n() == b.n()) {
if (a.m() == b.m()) { // a.n() == b.n()
double* newx = new double [b.m()*b.n()];
double* s = newx;
double* t = newx;
double* u = a.x();
double* v = b.x();
while ((t += b.n()) <= &newx[b.m()*b.n()]) {
while (s < t)
*s++ = *u++ + *v++;
u += a.l() - a.n();
v += b.l() - b.n();
};
return doubleMatrix(b.m(), b.n(), newx);
};
if (a.m() == 1) { // a.n() == b.n() && a.m() != b.m()
double* newx = new double [b.m()*b.n()];
double* s = newx;
double* t = newx;
double* v = b.x();
while ((t += b.n()) <= &newx[b.m()*b.n()]) {
double* u = a.x();
while (s < t)
*s++ = *u++ + *v++;
v += b.l() - b.n();
};
return doubleMatrix(b.m(), b.n(), newx);
};
if (b.m() == 1) { // a.n() == b.n() && a.m() != b.m() && a.m() != 1
double* newx = new double [a.m()*a.n()];
double* s = newx;
double* t = newx;
double* u = a.x();
while ((t += a.n()) <= &newx[a.m()*a.n()]) {
double* v = b.x();
while (s < t)
*s++ = *u++ + *v++;
u += a.l() - a.n();
};
return doubleMatrix(a.m(), a.n(), newx);
};
};
if (a.n() == 1) { // b.n() != a.n()
if (a.m() == b.m()) { // b.n() != a.n() == 1
double* newx = new double [b.m()*b.n()];
double* s = newx;
double* t = newx;
double* u = a.x();
double* v = b.x();
while ((t += b.n()) <= &newx[b.m()*b.n()]) {
while (s < t)
*s++ = *u + *v++;
u++;
v += b.l() - b.n();
};
return doubleMatrix(b.m(), b.n(), newx);
};
if (a.m() == 1) { // b.n() != a.n() == 1 && a.m() != b.m()
double* newx = new double [b.m()*b.n()];
double* s = newx;
double* t = newx;
double* u = a.x();
double* v = b.x();
while ((t += b.n()) <= &newx[b.m()*b.n()]) {
while (s < t)
*s++ = *u + *v++;
v += b.l() - b.n();
};
return doubleMatrix(b.m(), b.n(), newx);
};
};
if (b.n() == 1) { // a.n() != b.n() && a.n() != 1
if (a.m() == b.m()) { // a.n() != b.n() == 1
double* newx = new double [a.m()*a.n()];
double* s = newx;
double* t = newx;
double* u = a.x();
double* v = b.x();
while ((t += a.n()) <= &newx[a.m()*a.n()]) {
while (s < t)
*s++ = *u++ + *v;
u += a.l() - a.n();
v++;
};
return doubleMatrix(a.m(), a.n(), newx);
};
if (b.m() == 1) { // a.n() != b.n() == 1 && a.m() != b.m()
double* newx = new double [a.m()*a.n()];
double* s = newx;
double* t = newx;
double* u = a.x();
double* v = b.x();
while ((t += a.n()) <= &newx[a.m()*a.n()]) {
while (s < t)
*s++ = *u++ + *v;
u += a.l() - a.n();
};
return doubleMatrix(a.m(), a.n(), newx);
};
};
a.error("nonconformant doubleArray + operands.");
return doubleMatrix();
}
doubleMatrix operator - (const double& a, const doubleArray& b) {
double* newx = new double [b.m()*b.n()];
double* t = newx;
double* u = b.x();
double* v = b.x() + b.n();
do {
while (u < v)
*t++ = a - *u++;
u += b.l() - b.n();
} while ((v += b.l()) <= &b.x()[b.m()*b.l()]);
return doubleMatrix(b.m(), b.n(), newx);
}
doubleMatrix operator - (const doubleArray& a, const double& b) {
double* newx = new double [a.m()*a.n()];
double* t = newx;
double* u = a.x();
double* v = a.x() + a.n();
do {
while (u < v)
*t++ = *u++ - b;
u += a.l() - a.n();
} while ((v += a.l()) <= &a.x()[a.m()*a.l()]);
return doubleMatrix(a.m(), a.n(), newx);
}
doubleMatrix operator - (const doubleArray& a, const doubleArray& b) {
if (a.n() == b.n()) {
if (a.m() == b.m()) { // a.n() == b.n()
double* newx = new double [b.m()*b.n()];
double* s = newx;
double* t = newx;
double* u = a.x();
double* v = b.x();
while ((t += b.n()) <= &newx[b.m()*b.n()]) {
while (s < t)
*s++ = *u++ - *v++;
u += a.l() - a.n();
v += b.l() - b.n();
};
return doubleMatrix(b.m(), b.n(), newx);
};
if (a.m() == 1) { // a.n() == b.n() && a.m() != b.m()
double* newx = new double [b.m()*b.n()];
double* s = newx;
double* t = newx;
double* v = b.x();
while ((t += b.n()) <= &newx[b.m()*b.n()]) {
double* u = a.x();
while (s < t)
*s++ = *u++ - *v++;
v += b.l() - b.n();
};
return doubleMatrix(b.m(), b.n(), newx);
};
if (b.m() == 1) { // a.n() == b.n() && a.m() != b.m() && a.m() != 1
double* newx = new double [a.m()*a.n()];
double* s = newx;
double* t = newx;
double* u = a.x();
while ((t += a.n()) <= &newx[a.m()*a.n()]) {
double* v = b.x();
while (s < t)
*s++ = *u++ - *v++;
u += a.l() - a.n();
};
return doubleMatrix(a.m(), a.n(), newx);
};
};
if (a.n() == 1) { // b.n() != a.n()
if (a.m() == b.m()) { // b.n() != a.n() == 1
double* newx = new double [b.m()*b.n()];
double* s = newx;
double* t = newx;
double* u = a.x();
double* v = b.x();
while ((t += b.n()) <= &newx[b.m()*b.n()]) {
while (s < t)
*s++ = *u - *v++;
u++;
v += b.l() - b.n();
};
return doubleMatrix(b.m(), b.n(), newx);
};
if (a.m() == 1) { // b.n() != a.n() == 1 && a.m() != b.m()
double* newx = new double [b.m()*b.n()];
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?