10 #ifndef __RD_SYMM_MATRIX_H__ 11 #define __RD_SYMM_MATRIX_H__ 16 #include <boost/smart_ptr.hpp> 35 memset(static_cast<void *>(data), 0,
d_dataSize *
sizeof(TYPE));
57 const TYPE *otherData = other.
getData();
59 memcpy(static_cast<void *>(data), static_cast<const void *>(otherData),
76 memset(static_cast<void *>(data), 0,
d_dataSize *
sizeof(TYPE));
77 for (
unsigned int i = 0; i <
d_size; i++) {
78 data[i * (i + 3) / 2] = (TYPE)1.0;
82 TYPE
getVal(
unsigned int i,
unsigned int j)
const {
87 id = i * (i + 1) / 2 + j;
89 id = j * (j + 1) / 2 + i;
94 void setVal(
unsigned int i,
unsigned int j, TYPE val) {
99 id = i * (i + 1) / 2 + j;
101 id = j * (j + 1) / 2 + i;
109 TYPE *data =
d_data.get();
110 for (
unsigned int j = 0; j <
d_size; j++) {
113 id = i * (i + 1) / 2 + j;
115 id = j * (j + 1) / 2 + i;
124 TYPE *data =
d_data.get();
125 for (
unsigned int j = 0; j <
d_size; j++) {
128 id = j * (j + 1) / 2 + i;
130 id = i * (i + 1) / 2 + j;
143 TYPE *data =
d_data.get();
144 for (
unsigned int i = 0; i <
d_dataSize; i++) {
151 TYPE *data =
d_data.get();
152 for (
unsigned int i = 0; i <
d_dataSize; i++) {
160 "Sizes don't match in the addition");
161 const TYPE *oData = other.
getData();
162 TYPE *data =
d_data.get();
163 for (
unsigned int i = 0; i <
d_dataSize; i++) {
171 "Sizes don't match in the addition");
172 const TYPE *oData = other.
getData();
173 TYPE *data =
d_data.get();
174 for (
unsigned int i = 0; i <
d_dataSize; i++) {
183 "Size mismatch during multiplication");
185 const TYPE *bData = B.
getData();
186 TYPE *data =
d_data.get();
187 for (
unsigned int i = 0; i <
d_size; i++) {
188 unsigned int idC = i * (i + 1) / 2;
189 for (
unsigned int j = 0; j < i + 1; j++) {
190 unsigned int idCt = idC + j;
191 cData[idCt] = (TYPE)0.0;
192 for (
unsigned int k = 0; k <
d_size; k++) {
193 unsigned int idA, idB;
195 idA = i * (i + 1) / 2 + k;
197 idA = k * (k + 1) / 2 + i;
200 idB = j * (j + 1) / 2 + k;
202 idB = k * (k + 1) / 2 + j;
204 cData[idCt] += (data[idA] * bData[idB]);
209 for (
unsigned int i = 0; i <
d_dataSize; i++) {
220 "Size mismatch during transposing");
221 TYPE *tData = transpose.
getData();
222 TYPE *data =
d_data.get();
223 for (
unsigned int i = 0; i <
d_dataSize; i++) {
260 template <
class TYPE>
263 unsigned int aSize = A.
numRows();
265 "Size mismatch in matric multiplication");
267 "Size mismatch in matric multiplication");
269 const TYPE *aData = A.
getData();
270 const TYPE *bData = B.
getData();
271 for (
unsigned int i = 0; i < aSize; i++) {
272 unsigned int idC = i * (i + 1) / 2;
273 for (
unsigned int j = 0; j < i + 1; j++) {
274 unsigned int idCt = idC + j;
275 cData[idCt] = (TYPE)0.0;
276 for (
unsigned int k = 0; k < aSize; k++) {
277 unsigned int idA, idB;
279 idA = i * (i + 1) / 2 + k;
281 idA = k * (k + 1) / 2 + i;
284 idB = j * (j + 1) / 2 + k;
286 idB = k * (k + 1) / 2 + j;
288 cData[idCt] += (aData[idA] * bData[idB]);
311 template <
class TYPE>
314 unsigned int aSize = A.
numRows();
317 const TYPE *xData = x.
getData();
318 const TYPE *aData = A.
getData();
320 for (
unsigned int i = 0; i < aSize; i++) {
321 yData[i] = (TYPE)(0.0);
322 unsigned int idA = i * (i + 1) / 2;
323 for (
unsigned int j = 0; j < i + 1; j++) {
325 yData[i] += (aData[idA] * xData[j]);
329 for (
unsigned int j = i + 1; j < aSize; j++) {
332 yData[i] += (aData[idA] * xData[j]);
344 template <
class TYPE>
347 unsigned int nr = mat.
numRows();
348 unsigned int nc = mat.
numCols();
349 target <<
"Rows: " << mat.
numRows() <<
" Columns: " << mat.
numCols() <<
"\n";
351 for (
unsigned int i = 0; i < nr; i++) {
352 for (
unsigned int j = 0; j < nc; j++) {
353 target << std::setw(7) << std::setprecision(3) << mat.
getVal(i, j);
SymmMatrix< int > IntSymmMatrix
void getRow(unsigned int i, Vector< TYPE > &row)
unsigned int size() const
return the size (dimension) of the vector
SymmMatrix< TYPE > & operator/=(TYPE scale)
SymmMatrix(const SymmMatrix< TYPE > &other)
#define CHECK_INVARIANT(expr, mess)
SymmMatrix< TYPE > & operator*=(TYPE scale)
A symmetric matrix class.
SymmMatrix(unsigned int N, TYPE val)
TYPE getVal(unsigned int i, unsigned int j) const
SymmMatrix< double > DoubleSymmMatrix
SymmMatrix< TYPE > & transposeInplace()
SymmMatrix< TYPE > & operator*=(const SymmMatrix< TYPE > &B)
in-place matrix multiplication
SymmMatrix< TYPE > & transpose(SymmMatrix< TYPE > &transpose) const
unsigned int getDataSize() const
TYPE * getData()
returns a pointer to our data array
unsigned int numRows() const
returns the number of rows
void setVal(unsigned int i, unsigned int j, TYPE val)
void getCol(unsigned int i, Vector< TYPE > &col)
boost::shared_array< TYPE > DATA_SPTR
const TYPE * getData() const
returns a const pointer to our data array
SymmMatrix< unsigned int > UintSymmMatrix
Matrix< TYPE > & multiply(const Matrix< TYPE > &A, const Matrix< TYPE > &B, Matrix< TYPE > &C)
Matrix multiplication.
#define URANGE_CHECK(x, hi)
SymmMatrix< TYPE > & operator+=(const SymmMatrix< TYPE > &other)
SymmMatrix(unsigned int N)
TYPE * getData()
returns a pointer to our data array
A class to represent vectors of numbers.
unsigned int numCols() const
returns the number of columns
std::ostream & operator<<(std::ostream &target, const RDNumeric::SymmMatrix< TYPE > &mat)
ostream operator for Matrix's
SymmMatrix(unsigned int N, DATA_SPTR data)
SymmMatrix< TYPE > & operator-=(const SymmMatrix< TYPE > &other)