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.

vectmath.h 2.2 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #ifndef VECTMATH
  2. #define VECTMATH
  3. #include <vector>
  4. #include <cassert>
  5. #include <iostream>
  6. #include <algorithm>
  7. #include <functional>
  8. // dot product
  9. template <typename T>
  10. std::vector<std::vector<T> > dot(const std::vector<std::vector<T> >& a, const std::vector<std::vector<T> >& b){
  11. assert(a[0].size()==b.size());
  12. T w=0;
  13. std::vector<std::vector<T> > result(a.size(), std::vector<T>(b[0].size()));
  14. for (int i=0 ; i<a.size() ; i++){
  15. for (int j=0 ; j<b[0].size() ; j++){
  16. for (int h=0 ; h<b.size() ; h++){
  17. w += a[i][h]*b[h][j];
  18. }
  19. result[i][j] = w;
  20. w=0;
  21. }
  22. }
  23. return result;
  24. }
  25. // operators
  26. template <typename U, typename V>
  27. std::vector<U>& operator-=(std::vector<U>& u, const std::vector<V>& v){
  28. assert(u.size()==v.size());
  29. for(size_t i=0 ; i<u.size() ; i++){
  30. u[i] -= v[i];
  31. }
  32. return u;
  33. }
  34. template <typename U>
  35. std::vector<U> operator+(const std::vector<U>& u, const std::vector<U>& v){
  36. assert(u.size()==v.size());
  37. std::vector<U> w(u.size());
  38. for(size_t i=0 ; i<w.size() ; i++){
  39. w[i] = u[i]+v[i];
  40. }
  41. return w;
  42. }
  43. template <typename U, typename S>
  44. std::vector<U> operator*(const S& s, const std::vector<U>& u){
  45. std::vector<U> result(u.size());
  46. for(size_t i=0 ; i<u.size() ; i++){
  47. result[i] = s*u[i];
  48. }
  49. return result;
  50. }
  51. template <typename U>
  52. std::vector<U>& operator>>(U (*fun)(U&), std::vector<U>& u){
  53. std::transform(u.begin(), u.end(), u.begin(), fun);
  54. return u;
  55. }
  56. template <typename U, typename S>
  57. std::vector<U>& operator>>(S (*fun)(S&), std::vector<U>& u){
  58. for(auto& v : u){
  59. fun >> v;
  60. }
  61. return u;
  62. }
  63. template <typename U>
  64. std::vector<U>& operator>>(U (*fun)(), std::vector<U>& u){
  65. for(auto& e : u){
  66. e = fun();
  67. }
  68. return u;
  69. }
  70. template <typename U, typename S>
  71. std::vector<U>& operator>>(S (*fun)(), std::vector<U>& u){
  72. for(auto& v : u){
  73. fun >> v;
  74. }
  75. return u;
  76. }
  77. template <typename U>
  78. std::ostream& operator<<(std::ostream& os, const std::vector<U>& u){
  79. os << "[";
  80. for(size_t i=0 ; i<u.size() ; i++){
  81. os << u[i] << (i<u.size()-1?", ":"");
  82. }
  83. os << "]";
  84. return os;
  85. }
  86. #endif

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

Contributors (1)