00001
00005 template<class T, class S> class diagonal_matrix : public matrix<T, S>
00006 {
00007 private:
00008 vector<S> _val;
00009 public:
00014 diagonal_matrix(const vector<S> &_val)
00015 {
00016 this->_val = _val;
00017 }
00023 void multiply(const packed_vector<S> &_x, packed_vector<S> &_b) const
00024 {
00025 const S *a = &_val[0];
00026 const S *x = &_x[0];
00027 S *b = &_b[0];
00028 int m = (int)_val.size();
00029 int n = _x.numrhs();
00030 switch(n)
00031 {
00032 case 0:
00033 break;
00034 case 1:
00035 for(int i = 0; i < m; i++)
00036 {
00037 S val = a[i];
00038 b[i] = val * x[i];
00039 }
00040 break;
00041 case 2:
00042 for(int i = 0; i < m; i++)
00043 {
00044 T k = 2 * i;
00045 S val = a[i];
00046 b[k + 0] = val * x[k + 0];
00047 b[k + 1] = val * x[k + 1];
00048 }
00049 break;
00050 case 3:
00051 for(int i = 0; i < m; i++)
00052 {
00053 T k = 3 * i;
00054 S val = a[i];
00055 b[k + 0] = val * x[k + 0];
00056 b[k + 1] = val * x[k + 1];
00057 b[k + 2] = val * x[k + 2];
00058 }
00059 break;
00060 case 4:
00061 for(int i = 0; i < m; i++)
00062 {
00063 T k = 4 * i;
00064 S val = a[i];
00065 b[k + 0] = val * x[k + 0];
00066 b[k + 1] = val * x[k + 1];
00067 b[k + 2] = val * x[k + 2];
00068 b[k + 3] = val * x[k + 3];
00069 }
00070 break;
00071 default:
00072 for(int i = 0; i < m; i++)
00073 {
00074 T k = n * i;
00075 S val = a[i];
00076 for(int j = 0; j < n; j++)
00077 {
00078 b[k + j] = val * x[k + j];
00079 }
00080 }
00081 }
00082 }
00083 };