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 + -
显示快捷键?