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