24 #ifdef BT_DEBUG_OSTREAM 27 #endif //BT_DEBUG_OSTREAM 62 return m_storage.
size();
88 for (
int ix=0;ix<nn;ix++)
90 if ((*
this)[ix] != 0.0)
92 T absxi =
btFabs((*
this)[ix]);
97 ssq = ssq * (temp * temp) +
BT_ONE;
103 temp = absxi / scale;
108 norm = scale * sqrt(ssq);
116 if (m_storage.
size())
124 const T& operator[] (
int index)
const 126 return m_storage[index];
129 T& operator[] (
int index)
131 return m_storage[index];
136 return m_storage.
size() ? &m_storage[0] : 0;
141 return m_storage.
size() ? &m_storage[0] : 0;
154 template <
typename T>
168 return m_storage.
size() ? &m_storage[0] : 0;
173 return m_storage.
size() ? &m_storage[0] : 0;
179 m_resizeOperations(0),
180 m_setElemOperations(0)
187 m_resizeOperations(0),
188 m_setElemOperations(0)
194 m_resizeOperations++;
199 m_storage.
resize(rows*cols);
221 if (m_storage[col+row*m_cols]==0.f)
226 m_storage[row*m_cols+col] += val;
234 m_setElemOperations++;
235 m_storage[row*m_cols+col] = val;
240 m_setElemOperations++;
243 m_storage[row*m_cols+col] *= val;
252 for (
int row=0;row<rows();row++)
254 for (
int col=0;col<row;col++)
256 setElem(col,row, (*
this)(row,col));
266 return m_storage[col+row*m_cols];
286 for (
int row=0;row<rows();row++)
296 printf(
"%s ---------------------\n",msg);
297 for (
int i=0;i<rows();i++)
300 for (
int j=0;j<cols();j++)
302 printf(
"%2.1f\t",(*
this)(i,j));
305 printf(
"\n---------------------\n");
312 m_rowNonZeroElements1.
resize(rows());
313 for (
int i=0;i<rows();i++)
315 m_rowNonZeroElements1[i].
resize(0);
316 for (
int j=0;j<cols();j++)
318 if ((*
this)(i,j)!=0.f)
330 for (
int i=0;i<m_cols;i++)
331 for (
int j=0;j<m_rows;j++)
351 for (
int j=0; j < res.cols(); ++j)
354 for (
int i=0; i < res.rows(); ++i)
363 for (
int v=0;v<rows();v++)
368 dotProd+=w*other(v,j);
375 res.setElem(i,j,dotProd);
386 for (
int i = 0;i<numRows;i++)
389 for (
int j = 0;j<numRowsOther;j++)
398 addElem(row+i,col+j,sum);
407 btAssert (numRows>0 && numRowsOther>0 && B && C);
409 for (
int i = 0;i<numRows;i++)
412 for (
int j = 0;j<numRowsOther;j++)
428 void setSubMatrix(
int rowstart,
int colstart,
int rowend,
int colend,
const T value)
430 int numRows = rowend+1-rowstart;
431 int numCols = colend+1-colstart;
433 for (
int row=0;row<numRows;row++)
435 for (
int col=0;col<numCols;col++)
437 setElem(rowstart+row,colstart+col,value);
446 for (
int row=0;row<block.
rows();row++)
448 for (
int col=0;col<block.
cols();col++)
450 setElem(rowstart+row,colstart+col,block(row,col));
458 for (
int row=0;row<block.
rows();row++)
460 for (
int col=0;col<block.
cols();col++)
462 setElem(rowstart+row,colstart+col,block[row]);
471 for (
int i=0;i<rows();i++)
472 for (
int j=0;j<cols();j++)
491 #ifdef BT_DEBUG_OSTREAM 492 template <
typename T>
493 std::ostream& operator<< (std::ostream& os, const btMatrixX<T>& mat)
498 for (
int i=0;i<mat.rows();i++)
500 for (
int j=0;j<mat.cols();j++)
502 os << std::setw(12) << mat(i,j);
505 os << std::endl <<
" ";
512 template <
typename T>
513 std::ostream& operator<< (std::ostream& os, const btVectorX<T>& mat)
518 for (
int i=0;i<mat.rows();i++)
520 os << std::setw(12) << mat[i];
522 os << std::endl <<
" ";
530 #endif //BT_DEBUG_OSTREAM 543 #ifdef BT_USE_DOUBLE_PRECISION 544 #define btVectorXu btVectorXd 545 #define btMatrixXu btMatrixXd 547 #define btVectorXu btVectorXf 548 #define btMatrixXu btMatrixXf 549 #endif //BT_USE_DOUBLE_PRECISION 553 #endif//BT_MATRIX_H_H void setElem(int row, int col, T val)
static T sum(const btAlignedObjectArray< T > &items)
btVectorX< double > btVectorXd
void push_back(const T &_Val)
btAlignedObjectArray< T > m_storage
btAlignedObjectArray< T > m_storage
The btAlignedObjectArray template class uses a subset of the stl::vector interface for its methods It...
bool operator()(const int &a, const int &b) const
btVectorX< float > btVectorXf
void mulElem(int row, int col, T val)
original version written by Erwin Coumans, October 2013
void printMatrix(const char *msg)
T * getBufferPointerWritable()
void setSubMatrix(int rowstart, int colstart, int rowend, int colend, const btMatrixX &block)
void addElem(int row, int col, T val)
we don't want this read/write operator(), because we cannot keep track of non-zero elements...
const T * getBufferPointer() const
void setSubMatrix(int rowstart, int colstart, int rowend, int colend, const btVectorX< T > &block)
T * getBufferPointerWritable()
void btSetZero(T *a, int n)
int size() const
return the number of elements in the array
btMatrixX< double > btMatrixXd
btMatrixX transpose() const
void multiply2_p8r(const btScalar *B, const btScalar *C, int numRows, int numRowsOther, int row, int col)
void setSubMatrix(int rowstart, int colstart, int rowend, int colend, const T value)
void rowComputeNonZeroElements() const
const T * getBufferPointer() const
btMatrixX< float > btMatrixXf
void resize(int newsize, const T &fillData=T())
void setElem(btMatrixXd &mat, int row, int col, double val)
void multiplyAdd2_p8r(const btScalar *B, const btScalar *C, int numRows, int numRowsOther, int row, int col)
void copyLowerToUpperTriangle()
void resize(int rows, int cols)
btMatrixX operator*(const btMatrixX &other)
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
btAlignedObjectArray< btAlignedObjectArray< int > > m_rowNonZeroElements1
btMatrixX(int rows, int cols)
btScalar btFabs(btScalar x)