Matrix.h
上传用户:guanx8y8
上传日期:2007-07-30
资源大小:326k
文件大小:13k
开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. // Matrix.h : 
  3. // Interface of the class CMatrix
  4. // Author : freeia
  5. // Modified Date : 3/11/2003
  6. // E-mail : freeia@163.com
  7. // Company/School : hdcad
  8. /////////////////////////////////////////////////////////////////////////////
  9. #ifndef _MATRIX_H
  10. #define _MATRIX_H
  11. #include <vector>
  12. using namespace std;
  13. typedef vector <double> VDOUBLE;
  14. typedef vector <VDOUBLE> TMatrix;
  15. class __declspec(dllexport) CMatrix  
  16. {
  17. /************************************************************************
  18. * the interface function of the class CMatrix  *
  19. ************************************************************************/
  20. public:
  21. /////////////////////////////////////////////////////////////////////////
  22. // Construction and Destruction
  23. CMatrix();
  24. CMatrix(CMatrix& cMatrixB);
  25. virtual ~CMatrix();
  26. TMatrix m_pTMatrix; // 指向矩阵的头指针
  27. /////////////////////////////////////////////////////////////////////////
  28. // According to the parameters nRow & nCol to construct a matrix
  29. CMatrix(unsigned int nRow, unsigned int nCol);
  30. /////////////////////////////////////////////////////////////////////////
  31. // This function initialize the matrix :
  32. // the matrix which has been initialized has 0 row & 0 column, and
  33. // all elements in it is zeros.
  34. // 
  35. void Initialize();
  36. /////////////////////////////////////////////////////////////////////////
  37. // This function initialize the matrix :
  38. // the matrix which has been initialized has 0 row & 0 column, and
  39. // all elements in it is zeros.
  40. // 
  41. void InitializeZero();
  42. /////////////////////////////////////////////////////////////////////////
  43. // To make random in the elements of the matrix and the elements of the 
  44. // matrix has been randomized between -1 and 1.These elements must be
  45. // decimal fractions.
  46. // 
  47. void RandomInitialize();
  48. /////////////////////////////////////////////////////////////////////////
  49. // Overload Operations
  50. // 'CMatrix + CMatrix'
  51. CMatrix operator + (CMatrix& cMatrixB);
  52. // 'CMatrix - CMatrix'
  53. CMatrix operator - (CMatrix& cMatrixB);
  54. // 'CMatrix * CMatrix'
  55. CMatrix operator * (CMatrix& cMatrixB);
  56. // 'CMatrix * double'
  57. CMatrix operator * (double nValue);
  58. // 'CMatrix = CMatrix'
  59. CMatrix& operator = (CMatrix& cMatrixB);
  60. // 'CMatrix += CMatrix'
  61. CMatrix& operator += (CMatrix& cMatrixB);
  62. // 'CMatrix .* CMatrix'
  63. CMatrix operator / (CMatrix& cMatrixB);
  64. /////////////////////////////////////////////////////////////////////////
  65. // Transpose the matrix
  66. //
  67. CMatrix Transpose();
  68. /////////////////////////////////////////////////////////////////////////
  69. // Inverse the matrix
  70. //
  71. CMatrix Inverse();
  72. /////////////////////////////////////////////////////////////////////////
  73. // Load the data from the file and reset the rows and the colums of the 
  74. // matrix
  75. //
  76. bool LoadDataFromFile(CString& strFileName);
  77. /////////////////////////////////////////////////////////////////////////
  78. // Save the data from the CMatrix object to the specified file
  79. //
  80. bool SaveDataToFile(CString& strFileName);
  81. /////////////////////////////////////////////////////////////////////////
  82. // Get the matrix Row Number
  83. //
  84. unsigned int GetMatrixRowNumber() const
  85. {
  86. return m_nRow;
  87. }
  88. /////////////////////////////////////////////////////////////////////////
  89. // Get the matrix Colum Number
  90. //
  91. unsigned int GetMatrixColNumber() const
  92. {
  93. return m_nCol;
  94. }
  95. /////////////////////////////////////////////////////////////////////////////
  96. // Load the data from the file and reset the rows and the colums of 
  97. // the matrixes.
  98. // Parameter:
  99. // [in] strFileName
  100. // [out]cMatrixInputToHideWeightValue
  101. // [out]cMatrixHideLayerValveValue
  102. // [out]cMatrixHideToOutputWeightValue
  103. // [out]cMatrixOutputLayerValveValue
  104. // [out]nInputLayerNumber
  105. // [out]nHideLayerNumber
  106. // [out]nOutputLayerNumber
  107. // [out]nComboArithmetic
  108. // [out]nComboFunc
  109. //
  110. bool LoadDataFromFileSpecial ( CString& strFileName,
  111. CMatrix& cMatrixInputToHideWeightValue,
  112. CMatrix& cMatrixHideLayerValveValue,
  113. CMatrix& cMatrixHideToOutputWeightValue,
  114. CMatrix& cMatrixOutputLayerValveValue,
  115. unsigned int &nInputLayerNumber,
  116. unsigned int &nHideLayerNumber,
  117. unsigned int &nOutputLayerNumber,
  118. int &nComboArithmetic,
  119. int &nComboFunc);
  120. /////////////////////////////////////////////////////////////////////////
  121. // Copy data from a vector to a matrix
  122. // Parameter:
  123. // [out] cMatrix ----> the returned value
  124. // [in] nIndex ----> the index in vector
  125. // Notes:
  126. // the object copied must be vector!!!
  127. //
  128. void CopySubMatrixFromVector(CMatrix& cMatrix,unsigned int nIndex);
  129. /////////////////////////////////////////////////////////////////////////
  130. // Copy data from sub matrix to another matrix
  131. // Parameter:
  132. // [out] cMatrix ----> 矩阵的子矩阵返回的结果
  133. // [in] nStartX ----> 子矩阵在矩阵中的起始坐标,对应行,索引从1开始
  134. // [in] nStartY ----> 子矩阵在矩阵中的起始坐标,对应列,索引从1开始
  135. //
  136. void CopySubMatrix(CMatrix& cMatrix,unsigned int nStartX,unsigned int nStartY);
  137. /////////////////////////////////////////////////////////////////////////
  138. // Copy Matrix
  139. // Parameter:
  140. // [in] cMatrix ----> be copied matrix
  141. //
  142. void CopyMatrix(CMatrix& cMatrix);
  143. /////////////////////////////////////////////////////////////////////////
  144. // 将矩阵的所有的元素按列合成一列
  145. // 例如:
  146. // matrix = [
  147. // 1 2 3
  148. // 4 5 6
  149. // 7 8 9
  150. // ]
  151. // CMatrix cMatrix = matrix.MergeColumnsToColumnVector();
  152. // cMatrix = 
  153. // [ 1
  154. // 4
  155. // 7
  156. // 2
  157. // 5
  158. // 8
  159. // 3
  160. // 6
  161. // 9 ]
  162. //
  163. CMatrix MergeColumnsToColumnVector();
  164. /////////////////////////////////////////////////////////////////////////
  165. // 对矩阵中所有的元素进行一次非线性变换:
  166. // 变换后的值y与变换前的值的关系是:
  167. // y = f(x) = 1 / (1 + exp(-x)) ( 0 < f(x) < 1)
  168. //
  169. CMatrix Sigmoid();
  170. /////////////////////////////////////////////////////////////////////////
  171. // 对矩阵中所有的元素进行一次非线性变换:
  172. // 变换后的值y与变换前的值的关系是:
  173. // y = f'(x) = (1 / (1 + exp(-x)))' ( 0 < f(x) < 1)
  174. //   = exp(-x)/((1 + exp(-x))*(1 + exp(-x)))
  175. //
  176. CMatrix SigmoidDerivative();
  177. /////////////////////////////////////////////////////////////////////////
  178. // 对矩阵中所有的元素进行一次非线性变换:
  179. // 变换后的值y与变换前的值的关系是:
  180. // y = tanh(x) = (1 - exp(-x)) / (1 + exp(-x))
  181. //  =  1 - 2 * exp(-x) / (1 + exp(-x)) ( -1 < f(x) < 1)
  182. //
  183. CMatrix tanh(); 
  184. /////////////////////////////////////////////////////////////////////////
  185. // 对矩阵中所有的元素进行一次非线性变换:
  186. // 变换后的值y与变换前的值的关系是:
  187. // y = tanh'(x) = ((1 - exp(-x)) / (1 + exp(-x)))' ( -1 < f(x) < 1)
  188. //  =  2*exp(-x)/((1 + exp(-x))*(1 + exp(-x)))
  189. //
  190. CMatrix tanhDerivative();
  191. /////////////////////////////////////////////////////////////////////////
  192. // 对矩阵中所有的元素进行一次非线性变换:
  193. // 变换后的值y与变换前的值的关系是:
  194. // y = Tansig(x) = 2 / (1 + exp(-2 * x)) -1
  195. //
  196. CMatrix Tansig();
  197. /////////////////////////////////////////////////////////////////////////
  198. // 对矩阵中所有的元素进行一次非线性变换:
  199. // 变换后的值y与变换前的值的关系是:
  200. // y = Tansig'(x) = (2 / (1 + exp(-2 * x)) -1)'
  201. // = (2 / (1 + exp(-2 * x)) -1) * (2 / (1 + exp(-2 * x)) -1) -1
  202. //
  203. CMatrix TansigDerivative();
  204. /////////////////////////////////////////////////////////////////////////
  205. // 对矩阵中的元素进行一次操作:
  206. // 使所有行中的相对应的列元素相等
  207. // Parameter:
  208. // nRowIndex ----> 行索引值(the index starts from 0)
  209. // 以此行做为标准,使矩阵中其余的行相对应的列的值
  210. // 与此行相对应的列的值相等
  211. //
  212. void MakeAllColumnElementsSameValue(unsigned int nRowIndex);
  213. /////////////////////////////////////////////////////////////////////////
  214. // 对矩阵中的元素进行一次操作:
  215. // 使矩阵变为单位阵
  216. //
  217. void Eye();
  218. /////////////////////////////////////////////////////////////////////////
  219. // Get System Error
  220. //
  221. double GetSystemError() const;
  222. /////////////////////////////////////////////////////////////////////////
  223. // Make all the matrix elements to be changed into absolute value
  224. //
  225. CMatrix AbsoluteValue();
  226. /////////////////////////////////////////////////////////////////////////
  227. // Parameter:
  228. // CMatrix& cMatrix: 被拷贝的数据源
  229. // unsigned int nIndex: 被拷贝的数据在对象中的开始索引位置
  230. // Purpose:
  231. // This function will copy all the data of the cMatrix
  232. // Notes:
  233. // The object must be column vector!!!
  234. //
  235. void GetMatrixData(CMatrix& cMatrix, unsigned int nIndex);
  236. /////////////////////////////////////////////////////////////////////////
  237. // Parameter:
  238. // CMatrix& cMatrix: 被填充的矩阵
  239. // unsigned int nIndex: 被拷贝的数据在对象中的开始索引位置
  240. // Purpose:
  241. // This function will copy part of the object data into cMatrix
  242. // Notes:
  243. // The object must be column vector!!!
  244. //
  245. void SetMatrixData(CMatrix& cMatrix, unsigned int nIndex);
  246. /////////////////////////////////////////////////////////////////////////
  247. // Parameter:
  248. // CMatrix& cMatrix: 被拷贝的数据源
  249. // unsigned int nIndex: 被拷贝的数据在对象中的开始索引位置
  250. // unsigned int nRow: 被拷贝的数据在被拷贝对象中的行索引(从0开始)
  251. // Purpose:
  252. // This function will copy all the data of the cMatrix
  253. // Notes:
  254. // The object must be column vector!!!
  255. //
  256. void GetMatrixRowData(CMatrix& cMatrix, unsigned int nIndex, unsigned int nRow);
  257. /////////////////////////////////////////////////////////////////////////
  258. // Parameter:
  259. // CMatrix& cMatrix: 被填充的矩阵
  260. // unsigned int nIndex: 被拷贝的数据在对象中的开始索引位置
  261. // unsigned int nRow: 被填充的数据在被填充对象中的行索引
  262. // Purpose:
  263. // This function will copy part of the object data to fill the special 
  264. // row of the cMatrix
  265. // Notes:
  266. // The object must be column vector!!!
  267. //
  268. void SetMatrixRowData(CMatrix& cMatrix, unsigned int nIndex, unsigned int nRow);
  269. /////////////////////////////////////////////////////////////////////////
  270. // Get the total value of the matrix
  271. double GetTotalElementValue();
  272. /////////////////////////////////////////////////////////////////////////
  273. // 对矩阵进行拓展
  274. // 实现功能:
  275. // 对矩阵的列数进行拓展,nTimes是每列拓展的次数
  276. //
  277. void nncpyi(CMatrix &cMatrix, unsigned int nTimes);
  278. /////////////////////////////////////////////////////////////////////////
  279. // 对矩阵进行拓展
  280. // 实现功能:
  281. // 对矩阵的列数进行拓展
  282. // matrix = [ 
  283. // 1 2 3
  284. // 4 5 6
  285. // 7 8 9
  286. // ]
  287. //
  288. // nncpyd(matrix) = [
  289. // 1 0 0 2 0 0 3 0 0
  290. // 0 4 0 0 5 0 0 6 0
  291. // 0 0 7 0 0 8 0 0 9
  292. // ]
  293. void nncpyd(CMatrix &cMatrix);
  294. /////////////////////////////////////////////////////////////////////////
  295. // 对矩阵进行拓展
  296. // 实现功能:
  297. // 对矩阵的列数进行拓展,nTimes是每列拓展的次数
  298. // matrix = [ 
  299. // 1 2 3
  300. // 4 5 6
  301. // 7 8 9
  302. // ]
  303. // nTimes = 2
  304. //
  305. // nncpyd(matrix) = [
  306. // 1 2 3 1 2 3
  307. // 4 5 6 4 5 6
  308. // 7 8 9 7 8 9
  309. // ]
  310. //
  311. void nncpy (CMatrix& cMatrix, unsigned int nTimes);
  312. private:
  313. unsigned int m_nRow; // 矩阵所拥有的行数
  314. unsigned int m_nCol; // 矩阵所拥有的列数
  315. /////////////////////////////////////////////////////////////////////////
  316. // 注意:
  317. // 在重新设置矩阵的行数和列数后,矩阵中的元素被重新初始化为0
  318. /////////////////////////////////////////////////////////////////////////
  319. /////////////////////////////////////////////////////////////////////////
  320. // 设置矩阵的行数
  321. //
  322. void SetMatrixRowNumber(unsigned int nRow);
  323. /////////////////////////////////////////////////////////////////////////
  324. // 设置矩阵的列数
  325. //
  326. void SetMatrixColNumber(unsigned int nCol);
  327. /////////////////////////////////////////////////////////////////////////
  328. // 设置矩阵的行列数
  329. //
  330. void SetMatrixRowAndCol(unsigned int nRow,unsigned int nCol);
  331. /////////////////////////////////////////////////////////////////////////
  332. // 交换矩阵的两行
  333. //
  334. void SwapMatrixRow(unsigned int nRow1,unsigned int nRow2);
  335. /////////////////////////////////////////////////////////////////////////
  336. // 交换矩阵的两列
  337. //
  338. void SwapMatrixCol(unsigned int nCol1,unsigned int nCol2);
  339. };
  340. /////////////////////////////////////////////////////////////////////////////
  341. // overload operator 'double - CMatrix'
  342. __declspec(dllexport) CMatrix operator - (double nValue,CMatrix& cMatrixB);
  343. /////////////////////////////////////////////////////////////////////////
  344. // 矩阵合并运算符
  345. // 合并规则:
  346. // 1. 参与合并运算的两个矩阵的行数必须相等;
  347. // 2. 参与合并的两个矩阵的列数可以不相等;
  348. // 3. 合并后返回的矩阵的行数与参与合并的矩阵的行数相等,列数是参与合并的
  349. // 两个矩阵的列数之和;
  350. //
  351. __declspec(dllexport) CMatrix MergeMatrix(CMatrix& cMatrixA,CMatrix& cMatrixB);
  352. #endif // _MATRIX_H