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),
82 memset(static_cast<void *>(data), 0,
d_dataSize*
sizeof(TYPE));
83 for (
unsigned int i = 0; i <
d_size; i++) {
84 data[i*(i+3)/2] = (TYPE)1.0;
88 TYPE
getVal(
unsigned int i,
unsigned int j)
const {
100 void setVal(
unsigned int i,
unsigned int j, TYPE val) {
115 TYPE *data =
d_data.get();
116 for (
unsigned int j = 0; j <
d_size; j++) {
130 TYPE *data =
d_data.get();
131 for (
unsigned int j = 0; j <
d_size; j++) {
153 TYPE *data =
d_data.get();
154 for (
unsigned int i = 0; i <
d_dataSize; i++) {
161 TYPE *data =
d_data.get();
162 for (
unsigned int i = 0; i <
d_dataSize; i++) {
170 const TYPE *oData = other.
getData();
171 TYPE *data =
d_data.get();
172 for (
unsigned int i = 0; i <
d_dataSize; i++) {
180 const TYPE *oData = other.
getData();
181 TYPE *data =
d_data.get();
182 for (
unsigned int i = 0; i <
d_dataSize; i++) {
192 const TYPE *bData = B.
getData();
193 TYPE *data =
d_data.get();
194 for (
unsigned int i = 0; i <
d_size; i++) {
195 unsigned int idC = i*(i+1)/2;
196 for (
unsigned int j = 0; j < i+1; j++) {
197 unsigned int idCt = idC + j;
198 cData[idCt] = (TYPE)0.0;
199 for (
unsigned int k = 0; k <
d_size; k++) {
200 unsigned int idA,idB;
211 cData[idCt] += (data[idA]*bData[idB]);
216 for (
unsigned int i = 0; i <
d_dataSize; i++) {
227 TYPE *tData = transpose.
getData();
228 TYPE *data =
d_data.get();
229 for (
unsigned int i = 0; i <
d_dataSize; i++) {
267 template <
class TYPE>
271 unsigned int aSize = A.
numRows();
275 const TYPE *aData = A.
getData();
276 const TYPE *bData = B.
getData();
277 for (
unsigned int i = 0; i < aSize; i++) {
278 unsigned int idC = i*(i+1)/2;
279 for (
unsigned int j = 0; j < i+1; j++) {
280 unsigned int idCt = idC + j;
281 cData[idCt] = (TYPE)0.0;
282 for (
unsigned int k = 0; k < aSize; k++) {
283 unsigned int idA,idB;
294 cData[idCt] += (aData[idA]*bData[idB]);
317 template <
class TYPE>
320 unsigned int aSize = A.
numRows();
323 const TYPE *xData = x.
getData();
324 const TYPE *aData = A.
getData();
326 for (
unsigned int i = 0; i < aSize; i++) {
327 yData[i] = (TYPE)(0.0);
328 unsigned int idA = i*(i+1)/2;
329 for (
unsigned int j = 0; j < i+1; j++) {
331 yData[i] += (aData[idA]*xData[j]);
335 for (
unsigned int j = i+1; j < aSize; j++) {
338 yData[i] += (aData[idA]*xData[j]);
350 template <
class TYPE > std::ostream &
operator<<(std::ostream& target,
352 unsigned int nr = mat.
numRows();
353 unsigned int nc = mat.
numCols();
354 target <<
"Rows: " << mat.
numRows() <<
" Columns: " << mat.
numCols() <<
"\n";
356 for (
unsigned int i = 0; i < nr; i++) {
357 for (
unsigned int j = 0; j < nc; j++) {
358 target << std::setw(7) << std::setprecision(3) << mat.
getVal(i, j);
SymmMatrix< int > IntSymmMatrix
void getRow(unsigned int i, Vector< TYPE > &row)
#define RANGE_CHECK(lo, x, hi)
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)
SymmMatrix< double > DoubleSymmMatrix
unsigned int size() const
return the size (dimension) of the vector
SymmMatrix< TYPE > & transposeInplace()
SymmMatrix< TYPE > & operator*=(const SymmMatrix< TYPE > &B)
in-place matrix multiplication
unsigned int numRows() const
returns the number of rows
const TYPE * getData() const
returns a const pointer to our data array
TYPE * getData()
returns a pointer to our data array
void setVal(unsigned int i, unsigned int j, TYPE val)
SymmMatrix< TYPE > & transpose(SymmMatrix< TYPE > &transpose) const
void getCol(unsigned int i, Vector< TYPE > &col)
boost::shared_array< TYPE > DATA_SPTR
unsigned int getDataSize() const
SymmMatrix< unsigned int > UintSymmMatrix
Matrix< TYPE > & multiply(const Matrix< TYPE > &A, const Matrix< TYPE > &B, Matrix< TYPE > &C)
Matrix multiplication.
SymmMatrix< TYPE > & operator+=(const SymmMatrix< TYPE > &other)
SymmMatrix(unsigned int N)
TYPE getVal(unsigned int i, unsigned int j) const
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)