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