00001
00005 template<class T, class S> class idx_matrix : public matrix<T, S>
00006 {
00007 private:
00008 vector<T> _row;
00009 vector<T> _col;
00010 vector<S> _val;
00011 public:
00018 idx_matrix(const vector<T> &_row, const vector<T> &_col, const vector<S> &_val)
00019 {
00020 this->_row = _row;
00021 this->_col = _col;
00022 this->_val = _val;
00023 }
00029 void multiply(const packed_vector<S> &_x, packed_vector<S> &_b) const
00030 {
00031 memset(&_b[0], 0, sizeof(S) * _b.size());
00032 const T *row = &_row[0], *col = &_col[0];
00033 const S *a = &_val[0];
00034 const S *x = &_x[0];
00035 S *b = &_b[0];
00036 int m = (int)_val.size();
00037 int n = _x.numrhs();
00038 switch(n)
00039 {
00040 case 0:
00041 break;
00042 case 1:
00043 for(int i = 0; i < m; i++)
00044 {
00045 T k = row[i];
00046 T l = col[i];
00047 S val = a[i];
00048 b[k] += val * x[l];
00049 }
00050 break;
00051 case 2:
00052 for(int i = 0; i < m; i++)
00053 {
00054 T k = 2 * row[i];
00055 T l = 2 * col[i];
00056 S val = a[i];
00057 b[k + 0] += val * x[l + 0];
00058 b[k + 1] += val * x[l + 1];
00059 }
00060 break;
00061 case 3:
00062 for(int i = 0; i < m; i++)
00063 {
00064 T k = 3 * row[i];
00065 T l = 3 * col[i];
00066 S val = a[i];
00067 b[k + 0] += val * x[l + 0];
00068 b[k + 1] += val * x[l + 1];
00069 b[k + 2] += val * x[l + 2];
00070 }
00071 break;
00072 case 4:
00073 for(int i = 0; i < m; i++)
00074 {
00075 T k = 4 * row[i];
00076 T l = 4 * col[i];
00077 S val = a[i];
00078 b[k + 0] += val * x[l + 0];
00079 b[k + 1] += val * x[l + 1];
00080 b[k + 2] += val * x[l + 2];
00081 b[k + 3] += val * x[l + 3];
00082 }
00083 break;
00084 case 8:
00085 for(int i = 0; i < m; i++)
00086 {
00087 T k = 8 * row[i];
00088 T l = 8 * col[i];
00089 S val = a[i];
00090 b[k + 0] += val * x[l + 0];
00091 b[k + 1] += val * x[l + 1];
00092 b[k + 2] += val * x[l + 2];
00093 b[k + 3] += val * x[l + 3];
00094 b[k + 4] += val * x[l + 4];
00095 b[k + 5] += val * x[l + 5];
00096 b[k + 6] += val * x[l + 6];
00097 b[k + 7] += val * x[l + 7];
00098 }
00099 break;
00100 case 16:
00101 for(int i = 0; i < m; i++)
00102 {
00103 T k = 16 * row[i];
00104 T l = 16 * col[i];
00105 S val = a[i];
00106 b[k + 0] += val * x[l + 0];
00107 b[k + 1] += val * x[l + 1];
00108 b[k + 2] += val * x[l + 2];
00109 b[k + 3] += val * x[l + 3];
00110 b[k + 4] += val * x[l + 4];
00111 b[k + 5] += val * x[l + 5];
00112 b[k + 6] += val * x[l + 6];
00113 b[k + 7] += val * x[l + 7];
00114 b[k + 8] += val * x[l + 8];
00115 b[k + 9] += val * x[l + 9];
00116 b[k + 10] += val * x[l + 10];
00117 b[k + 11] += val * x[l + 11];
00118 b[k + 12] += val * x[l + 12];
00119 b[k + 13] += val * x[l + 13];
00120 b[k + 14] += val * x[l + 14];
00121 b[k + 15] += val * x[l + 15];
00122 }
00123 break;
00124 default:
00125 for(int i = 0; i < m; i++)
00126 {
00127 T k = n * row[i];
00128 T l = n * col[i];
00129 S val = a[i];
00130 for(int j = 0; j < n; j++)
00131 {
00132 b[k + j] += val * x[l + j];
00133 }
00134 }
00135 }
00136 }
00137 };