You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

matrix_pro.h 11 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. /*
  2. ███████╗██████╗ ██████╗ ███████╗ ███████╗███╗ ██╗ ██████╗ ██╗███╗ ██╗███████╗
  3. ██╔════╝██╔══██╗██╔════╝ ██╔════╝ ██╔════╝████╗ ██║██╔════╝ ██║████╗ ██║██╔════╝
  4. █████╗ ██║ ██║██║ ███╗█████╗ █████╗ ██╔██╗ ██║██║ ███╗██║██╔██╗ ██║█████╗
  5. ██╔══╝ ██║ ██║██║ ██║██╔══╝ ██╔══╝ ██║╚██╗██║██║ ██║██║██║╚██╗██║██╔══╝
  6. ███████╗██████╔╝╚██████╔╝███████╗ ███████╗██║ ╚████║╚██████╔╝██║██║ ╚████║███████╗
  7. ╚══════╝╚═════╝ ╚═════╝ ╚══════╝ ╚══════╝╚═╝ ╚═══╝ ╚═════╝ ╚═╝╚═╝ ╚═══╝╚══════╝
  8. Author:Edge
  9. Web:likedge.top
  10. Date:20200925
  11. matrix add
  12. flag stand use binary or not default 1
  13. move_ele change the x,y to y,x
  14. get_T :get the matrix transpose
  15. input:Matrix a;
  16. output:Matrix a.transpose
  17. and -- just test
  18. ---------------------------------------------------------------
  19. if you have the better answer on it , it is nothing, just test~
  20. ---------------------------------------------------------------
  21. */
  22. #ifndef MATRIX_PRO
  23. #define MATRIX_PRO
  24. #include<iostream>
  25. #include<stdlib.h>
  26. #include<string>
  27. #define random(x) (rand()%x)
  28. void move_ele(int &ele1, int &ele2)
  29. {
  30. ele1 ^= ele2 ^= ele1 ^= ele2;
  31. }
  32. int add_by(int a,int b)
  33. {
  34. int ans;
  35. while(b)
  36. {
  37. ans = a^b;
  38. b = ((a&b)<<1);
  39. a = ans;
  40. }
  41. return a;
  42. }
  43. //two matrix add
  44. Matrix add(Matrix mid1,Matrix mid2,int flag=1)
  45. {
  46. if(mid1.row == mid2.row&&mid1.col == mid2.col)
  47. {
  48. for(int x = 0;x<mid1.row;x++)
  49. {
  50. for(int y = 0;y<mid1.col;y++)
  51. {
  52. if(flag==1)
  53. mid1.matrix[x][y]=add_by(mid1.matrix[x][y],mid2.matrix[x][y]);
  54. else
  55. mid1.matrix[x][y]+=mid2.matrix[x][y];
  56. }
  57. }
  58. }
  59. else{return mid1;}
  60. return mid1;
  61. }
  62. //subtract use default
  63. Matrix subtract(Matrix mid1,Matrix mid2)
  64. {
  65. Matrix result_subtract = CreateMatrix(mid1.row,mid2.col);
  66. for(int i=0; i<mid1.row; i++)
  67. {
  68. for(int j=0; j<mid1.col; j++)
  69. {
  70. result_subtract.matrix[i][j] = mid1.matrix[i][j]-mid2.matrix[i][j];
  71. }
  72. }
  73. return result_subtract;
  74. }
  75. Matrix mul(Matrix mid1,Matrix mid2)
  76. {
  77. Matrix mid3 = CreateMatrix(mid1.row,mid2.col);
  78. for(int i = 0;i<mid1.row;i++)
  79. {
  80. for(int j = 0;j<mid2.col;j++)
  81. {
  82. for(int k = 0;k<mid1.col;k++)
  83. {
  84. mid3.matrix[i][j]=mid3.matrix[i][j]+mid1.matrix[i][k]*mid2.matrix[k][j];
  85. }
  86. }
  87. }
  88. return mid3;
  89. }
  90. Matrix times_mat(double times,Matrix mid1)
  91. {
  92. for(int index_x=0; index_x<mid1.row; index_x++)
  93. {
  94. for(int index_y=0; index_y<mid1.col; index_y++)
  95. {
  96. mid1.matrix[index_x][index_y] = mid1.matrix[index_x][index_y]*times;
  97. }
  98. }
  99. return mid1;
  100. }
  101. Matrix get_T(Matrix mid1)
  102. {
  103. Matrix mid2 = CreateMatrix(mid1.col,mid1.row);
  104. for(int index_x = 0;index_x<mid1.row;index_x++)
  105. {
  106. for(int index_y=0;index_y<mid1.col;index_y++)
  107. {
  108. mid2.matrix[index_y][index_x]=mid1.matrix[index_x][index_y];
  109. }
  110. }
  111. return mid2;
  112. }
  113. double* flatten(Matrix mid1)
  114. {
  115. int size = mid1.row*mid1.col;
  116. double balance[size];
  117. double *p;
  118. p = balance;
  119. for ( int i = 0; i <size; i++ )
  120. {
  121. int index_x = i/mid1.col;
  122. int index_y = i%mid1.col;
  123. *(p+i) = mid1.matrix[index_x][index_y];
  124. }
  125. return balance;
  126. }
  127. Matrix matrix_rs(Matrix mid1,int rs_row,int rs_col)
  128. {
  129. int size = mid1.row*mid1.col;
  130. double balance[size];
  131. double *p;
  132. p = balance;
  133. int index_x=0,index_y=0;
  134. Matrix result = CreateMatrix(rs_row,rs_col);
  135. for ( int i = 0; i <size; i++ )
  136. {
  137. int index_x = i/mid1.col;
  138. int index_y = i%mid1.col;
  139. *(p+i) = mid1.matrix[index_x][index_y];
  140. }
  141. int added = mid1.row*mid1.col;
  142. for(int i = 0;i<size;i++)
  143. {
  144. if(index_y == rs_col)
  145. {
  146. index_y=0;
  147. index_x+=1;
  148. }
  149. result.matrix[index_x][index_y]=*(p+i);
  150. index_y++;
  151. }
  152. return result;
  153. }
  154. double matrix_sum(Matrix mid1)
  155. {
  156. double sum = 0;
  157. for(int index_x = 0;index_x<mid1.row;++index_x)
  158. {
  159. for(int index_y=0;index_y<mid1.col;++index_y)
  160. {
  161. sum+=mid1.matrix[index_x][index_y];
  162. }
  163. }
  164. return sum;
  165. }
  166. double matrix_mean(Matrix mid1)
  167. {
  168. double ele = mid1.row*mid1.col;
  169. return matrix_sum(mid1)/ele;
  170. }
  171. Matrix mat_apply(Matrix mid1,Matrix mid2,int axis = 0)
  172. {
  173. int new_row = mid1.row+mid2.row;
  174. int new_col = mid1.col+mid2.col;
  175. Matrix result;
  176. if(axis ==1)
  177. {result = CreateMatrix(mid1.row,new_col);}
  178. else{result = CreateMatrix(new_row+1,mid2.col);}
  179. for(int index_x = 0;index_x<mid1.row;++index_x)
  180. {
  181. for(int index_y=0;index_y<mid1.col;++index_y)
  182. {
  183. result.matrix[index_x][index_y] = mid1.matrix[index_x][index_y];
  184. }
  185. }
  186. if(axis == 1)
  187. {
  188. for(int index_row=0;index_row<mid2.row;++index_row)
  189. {
  190. for(int index_col = mid1.col;index_col<new_col;++index_col)
  191. {
  192. result.matrix[index_row][index_col]= mid2.matrix[index_row][mid2.col-new_col+index_col];
  193. }
  194. }
  195. }
  196. else
  197. {
  198. for(int index_row=mid1.row;index_row<new_row;++index_row)
  199. {
  200. for(int index_col = 0;index_col<mid2.col;++index_col)
  201. {
  202. result.matrix[index_row][index_col]= mid2.matrix[index_row-mid2.row][index_col];
  203. }
  204. }
  205. }
  206. return result;
  207. }
  208. Matrix head(Matrix mid1)
  209. {
  210. int col = mid1.col;
  211. Matrix mid_return = CreateMatrix(6,mid1.col);
  212. for(int index_x = 0;index_x<6;++index_x)
  213. {
  214. for(int index_y=0;index_y<col;++index_y)
  215. {
  216. mid_return.matrix[index_x][index_y] = mid1.matrix[index_x][index_y];
  217. }
  218. }
  219. return mid_return;
  220. }
  221. void cout_mat(Matrix mid1)
  222. {
  223. for(int index_x = 0;index_x<mid1.row;index_x++)
  224. {
  225. for(int index_y=0;index_y<mid1.col;index_y++)
  226. {
  227. cout<<mid1.matrix[index_x][index_y]<<",";
  228. }
  229. cout<<endl;
  230. }
  231. }
  232. //iloc [x1,x2,y1,y2]
  233. Matrix iloc(Matrix mid1,int start_x=0,int end_x=0,int start_y=0,int end_y=0)
  234. {
  235. if(end_y == 0)
  236. {
  237. end_y = mid1.col;
  238. }
  239. else if(end_x == 0)
  240. {
  241. end_x = mid1.row;
  242. }
  243. // cout<<mid1.row<<end_x<<" "<<start_x<<" "<<end_y<<" "<<start_y<<endl;
  244. int new_row = end_x-start_x;
  245. int new_col = end_y-start_y;
  246. // cout<<"nc"<<new_col<<" nr"<<new_row<<endl;
  247. Matrix mid_return = CreateMatrix(new_row,new_col);
  248. for(int index_x = start_x;index_x<end_x;++index_x)
  249. {
  250. for(int index_y=start_y;index_y<end_y;++index_y)
  251. {
  252. mid_return.matrix[index_x-start_x][index_y-start_y] = mid1.matrix[index_x][index_y];
  253. }
  254. }
  255. return mid_return;
  256. }
  257. Matrix mul_simple(Matrix mid1,Matrix mid2)
  258. {
  259. if(mid1.row != mid2.row||mid1.col != mid2.col)
  260. {
  261. cout<<"Error: shape A&B"<<endl;
  262. return mid1;
  263. }
  264. Matrix result = CreateMatrix(mid1.row,mid1.col);
  265. for(int index_x = 0;index_x<mid1.row;index_x++)
  266. {
  267. for(int index_y=0;index_y<mid1.col;index_y++)
  268. {
  269. result.matrix[index_x][index_y] = mid1.matrix[index_x][index_y]*mid2.matrix[index_x][index_y];
  270. }
  271. }
  272. return result;
  273. }
  274. Matrix CreateRandMat(int x_dim,int y_dim)
  275. {
  276. int index_x,index_y;
  277. Matrix result = CreateMatrix(x_dim,y_dim);
  278. for(index_x = 0;index_x<x_dim;++index_x)
  279. {
  280. for(index_y=0;index_y<y_dim;++index_y)
  281. {
  282. double temp_val = (rand()%30000)*0.0001-1;
  283. change_va(result,index_x,index_y,temp_val);
  284. }
  285. }
  286. return result;
  287. }
  288. double edge_relu(double val_relu)
  289. {
  290. if(val_relu>0)
  291. {return val_relu;}
  292. else
  293. {return 0;}
  294. }
  295. Matrix mat_relu(Matrix mid1)
  296. {
  297. Matrix relu_mat = CreateMatrix(mid1.row,mid1.col);
  298. for(int index_x = 0;index_x<mid1.row;++index_x)
  299. for(int index_y = 0;index_y<mid1.row;++index_y)
  300. {
  301. {
  302. relu_mat.matrix[index_x][index_y] = edge_relu(mid1.matrix[index_x][index_y]);
  303. }
  304. }
  305. return relu_mat;
  306. }
  307. Matrix mat_sq_loss(Matrix mid1,Matrix mid2)
  308. {
  309. int index_x,index_y;
  310. Matrix mat_sq = CreateMatrix(mid1.row,1);
  311. for(index_x = 0;index_x<mid1.row;++index_x)
  312. {
  313. mat_sq.matrix[index_x][0] = pow(mid1.matrix[index_x][0]-mid2.matrix[index_x][0],2);
  314. }
  315. return mat_sq;
  316. }
  317. Matrix padding(Matrix mid1,int shape1,int shape2)
  318. {
  319. Matrix result = CreateMatrix(shape1,shape2);
  320. for(int index_x = 0;index_x<shape1;index_x++)
  321. {
  322. for(int index_y = 0;index_y<shape2;index_y++)
  323. {
  324. result.matrix[index_x][index_y] = mid1.matrix[index_x][0];
  325. }
  326. }
  327. return result;
  328. }
  329. Matrix get_row(Matrix mid1,int index)
  330. {
  331. int index_y = 0;
  332. Matrix mid2 = CreateMatrix(1,mid1.col);
  333. for(index_y=0;index_y<mid1.col;index_y++)
  334. {
  335. mid2.matrix[0][index_y] = mid1.matrix[index][index_y];
  336. }
  337. return mid2;
  338. }
  339. Matrix conv_element(Matrix mid1,Matrix kernel,int kernel_size = 2,int stride = 1)
  340. {
  341. Matrix conv_result = CreateMatrix(((mid1.row-kernel_size)/stride)+1,((mid1.col-kernel_size)/stride)+1);
  342. for(int x_ = 0;x_<=(mid1.row-kernel_size)/stride;x_+=stride)
  343. {
  344. for(int y_ = 0;y_<=(mid1.col-kernel_size)/stride;y_+=stride)
  345. {
  346. Matrix crop_pic = iloc(mid1,x_,x_+kernel.col,y_,y_+kernel.row);
  347. change_va(conv_result,x_,y_,matrix_sum(mul_simple(crop_pic,kernel)));
  348. }
  349. }
  350. // cout<<"row: "<<conv_result.row<<" , "<<"col: "<<conv_result.col<<endl;
  351. // cout_mat(conv_result);
  352. return conv_result;
  353. }
  354. /*
  355. parameter:
  356. Matrix mid1,
  357. int input_dim = 3
  358. int output_channels = 3
  359. int stride = 1
  360. int kernel_size = 2
  361. int mode = 0
  362. int padding = 0
  363. */
  364. double conv_test(Matrix mid1,int input_dim = 3,int output_channels = 3,int stride = 1,int kernel_size = 2,int mode = 0,int padding = 0)
  365. {
  366. // cout_mat(mid1);
  367. Matrix mid_rgb[input_dim];
  368. for(int rgb_idx = 0;rgb_idx<input_dim;rgb_idx++)
  369. {
  370. mid_rgb[rgb_idx] = CreateRandMat(mid1.row,mid1.col);
  371. }
  372. Matrix filters[output_channels][input_dim];
  373. for(int channel_index = 0;channel_index<input_dim;channel_index++)
  374. {
  375. for(int filter_index = 0;filter_index<output_channels;filter_index++)
  376. {
  377. Matrix kernel = ones(kernel_size,kernel_size);
  378. filters[channel_index][filter_index] = kernel;
  379. // cout<<"---------"<<endl;
  380. // cout<<"channel: "<<channel_index<<", index: "<<filter_index<<endl;
  381. // cout_mat(filters[channel_index][filter_index]);
  382. }
  383. }
  384. if(mode == 0)
  385. {
  386. cout<<"input_img:"<<endl;
  387. for(int i =0;i<input_dim;i++)
  388. {
  389. cout<<"---------rgb: "<<i<<"---------"<<endl;
  390. cout_mat(mid_rgb[i]);
  391. }
  392. Matrix conv_result = CreateMatrix(((mid1.row-kernel_size)/stride)+1,((mid1.col-kernel_size)/stride)+1);
  393. Matrix kernel = ones(kernel_size,kernel_size);
  394. cout<<"--------- kernels: 3x3--------"<<endl;
  395. cout_mat(kernel);
  396. cout<<"--------- output: ---------"<<endl;
  397. Matrix feature_maps[output_channels];
  398. for(int filter_idx = 0;filter_idx<output_channels;filter_idx++)
  399. {
  400. Matrix sum_rgb = CreateMatrix(((mid1.row-kernel_size)/stride)+1,((mid1.col-kernel_size)/stride)+1);
  401. for(int channel_idx=0;channel_idx<input_dim;channel_idx++)
  402. {
  403. sum_rgb = add(sum_rgb,conv_element(mid_rgb[channel_idx],filters[channel_idx][filter_idx],kernel_size,stride),0);
  404. cout<<"sum_rgb"<<"filters_index: "<<filter_idx<<" "<<endl;
  405. cout_mat(sum_rgb);
  406. }
  407. feature_maps[filter_idx]=sum_rgb;
  408. }
  409. for(int i = 0;i < output_channels;i++)
  410. {
  411. cout<<"==========filter: "<<i<<"========="<<endl;
  412. cout_mat(feature_maps[i]);
  413. }
  414. return 0.0;
  415. }
  416. }
  417. #endif

Edge : 一个开源的科学计算引擎