CMATRIX.H
上传用户:zengbais
上传日期:2022-08-08
资源大小:49k
文件大小:5k
开发平台:

C++ Builder

  1. #ifndef CMATRIX_H
  2. #define CMATRIX_H
  3. #include <iostream.h>
  4. #include <iomanip.h>
  5. #include <stdio.h>
  6. #include "cbuffer.h"
  7. #include "matrix.h"
  8. // 定义复矩阵类
  9. class cmatrix {
  10.  public:
  11. cbuffer * buf; // 指向复矩阵缓存类的指针
  12. size_t rownum, colnum; // 矩阵的行数与列数
  13. unsigned istrans:1; // 转置标记
  14. unsigned isneg:1; // 取负标记
  15. unsigned isconj:1; // 共轭标记
  16. cmatrix(cbuffer * b=0); // 缺省构造函数,产生0行0列空矩阵
  17. cmatrix(size_t n, cbuffer * b=0); // 产生n维列向量
  18. cmatrix(size_t r, size_t c, cbuffer * b=0); // 构造函数,构造一个空的复矩阵
  19. cmatrix(cmatrix& m); // 拷贝构造函数
  20. cmatrix(const char * filename, cbuffer * b=0); // 从数据文件构造一个复矩阵
  21. cmatrix(void * data, size_t r, size_t c=1, cbuffer * b=0);
  22.  // 从内存数据产生复矩阵
  23. cmatrix(matrix& m, cbuffer * b=0); // 由实矩阵产生一个内容相同的复矩阵
  24. cmatrix(matrix& mr, matrix& mi, cbuffer * b=0); // 两个实矩阵成为实部和虚部
  25. // 构成一复矩阵
  26. matrix real(); // 由矩阵的实部生成实矩阵
  27. matrix image(); // 由矩阵的虚部生成实矩阵
  28. COMPLEX operator()(size_t r, size_t c); // 重载函数运算符,返回第r行c列的值
  29. COMPLEX operator()(size_t r); // 重载函数运算符,返回第r行0列的值,用于向量
  30. virtual void set(size_t r, size_t c, COMPLEX v) { // 将第r行c列的值设为v
  31. size_t l;
  32. v = isneg ? -v : v;
  33. v = isconj ? ::conj(v) : v;
  34. l = istrans ? r+c*rownum : r*colnum+c;
  35. buf = buf->set(l, v); };
  36. void set(size_t r, COMPLEX v) {
  37. set(r,0,v);}; // 设置向量中第r个元素的值
  38. virtual ~cmatrix(){ // 析构函数
  39. buf->refnum--; // 缓存的引用数减1
  40. if(!buf->refnum) delete buf;}; // 如果缓存的引用数为0,则释放缓存
  41. cmatrix& operator=(cmatrix& m); // 重载赋值运算
  42. cmatrix& operator=(matrix& m); // 将实矩阵赋给复矩阵
  43. cmatrix& operator=(COMPLEX a); // 将矩阵所有元素设为常数a
  44. cmatrix operator*(COMPLEX a); // 数乘矩阵,产生新的矩阵
  45. cmatrix& operator*=(COMPLEX a); // 数乘矩阵,只是改动原矩阵
  46. friend cmatrix operator*(COMPLEX a, cmatrix& m); // 数乘矩阵
  47. cmatrix operator+(COMPLEX a); // 矩阵加常数,产生新矩阵
  48. cmatrix& operator+=(COMPLEX a); // 矩阵加常数,更动原矩阵
  49. friend cmatrix operator+(COMPLEX a, cmatrix& m); // 矩阵加常数,常数在前
  50. cmatrix operator+(cmatrix& m); // 矩阵加法,产生新的矩阵
  51. cmatrix& operator+=(cmatrix &m); // 矩阵加法,结果取代原矩阵
  52. cmatrix operator*(cmatrix& m); // 矩阵乘法,产生并返回新的矩阵
  53. cmatrix& operator*=(cmatrix& m); // 矩阵乘法,只是更动原矩阵
  54. cmatrix operator-(); // 矩阵求负,产生新的矩阵
  55. cmatrix& neg(); // 将自己求负,不产生新的矩阵
  56. cmatrix t(); // 矩阵转置,产生新的矩阵
  57. cmatrix& trans() // 矩阵自身转置
  58. {  size_t r = rownum; rownum = colnum; colnum = r; // 交换行数和列数
  59. istrans = !istrans; return (*this);};
  60. cmatrix& conj() // 矩阵共轭,原矩阵更动
  61. {isconj = !isconj; return (*this);};
  62. cmatrix operator!(); // 矩阵共轭,产生新的矩阵
  63. cmatrix& transconj() // 矩阵自身共轭转置
  64. { isconj = !isconj; trans(); return (*this);};
  65. cmatrix tc(); // 矩阵共轭转置,产生新的矩阵
  66. cmatrix operator-(cmatrix& a); // 矩阵相减
  67. cmatrix& operator-=(cmatrix& a); // 矩阵自身减矩阵
  68. cmatrix& operator-=(COMPLEX a); // 矩阵自身减常数
  69. cmatrix operator-(COMPLEX a); // 矩阵减常数,产生新的矩阵
  70. friend cmatrix operator-(COMPLEX a, cmatrix m); // 常数减矩阵,产生新的矩阵
  71. void swapr(size_t r1, size_t r2, size_t k=0); // 交换两行,只交换k列以上
  72. void swapc(size_t c1, size_t c2, size_t k=0); // 交换两列,只交换k行以上
  73. void swap(size_t r1, size_t c1, size_t r2, size_t c2){ // 交换两个元素
  74. COMPLEX a; a=(*this)(r1,c1);set(r1,c1,(*this)(r2,c2));
  75. set(r2,c2,a);};
  76. DOUBLE maxabs(size_t &r, size_t &c, size_t k=0);
  77.  // 求主元值和位置,即k行k列之后的最大元素,
  78. // 元素所在的行列将放在r,c中,返回此元素值
  79. size_t zgsxy(cmatrix & m, int fn=0); // 主高斯消元运算
  80. cmatrix& operator/=(cmatrix m); // 用主高斯消元法求解线性方程的解
  81. // 矩阵本身为系数矩阵,m为常数向量,返回解向量
  82. cmatrix& inv(); // 用全选主元高斯-约当法求逆矩阵
  83. cmatrix operator~(); // 求逆矩阵,但产生新矩阵
  84. friend cmatrix operator/(COMPLEX a, cmatrix& m); // 求逆矩阵再乘常数
  85. cmatrix& operator/=(COMPLEX a); // 所有元素乘a的倒数,自身改变
  86. cmatrix operator/(COMPLEX a); // 所有元素乘a的倒数,产生新的矩阵
  87. cmatrix& fft(int l=0);
  88. friend ostream& operator<<(ostream& o, cmatrix& m); // 矩阵的流输出
  89. friend istream& operator>>(istream& in, cmatrix& m); // 矩阵的流输入
  90. virtual COMPLEX value(size_t r, size_t c) { // 返回第r行c列的复数值
  91. COMPLEX v;
  92. v = istrans ? (*buf)[r+c*rownum] : (*buf)[r*colnum+c];
  93. v = isneg ? -v : v;
  94. v = isconj ? ::conj(v) : v;
  95. return v; };
  96. };
  97. inline cmatrix operator*(COMPLEX a, cmatrix& m) {
  98. return m*a;
  99. };
  100. inline cmatrix operator+(COMPLEX a, cmatrix& m){ // 矩阵加常数,常数在前
  101. return m+a;
  102. };
  103. cmatrix operator/(COMPLEX a, cmatrix& m); // 求逆矩阵再乘常数
  104. ostream& operator<<(ostream& o, cmatrix& m);
  105. istream& operator>>(istream& in, cmatrix& m);
  106. cmatrix cunit(size_t n); // 产生n阶单位复矩阵
  107. cmatrix fft(matrix& m); // 对实向量作fft变换
  108. matrix convolute(matrix&a, matrix& b); // 求矩阵a与b的离散卷积
  109. #endif // CMATRIX_H