25 #ifdef BT_DEBUG_OSTREAM 28 #endif //BT_DEBUG_OSTREAM 63 return m_storage.
size();
89 for (
int ix=0;ix<nn;ix++)
91 if ((*
this)[ix] != 0.0)
93 T absxi =
btFabs((*
this)[ix]);
98 ssq = ssq * (temp * temp) +
BT_ONE;
104 temp = absxi / scale;
109 norm = scale * sqrt(ssq);
117 if (m_storage.
size())
125 const T& operator[] (
int index)
const 127 return m_storage[index];
130 T& operator[] (
int index)
132 return m_storage[index];
137 return m_storage.
size() ? &m_storage[0] : 0;
142 return m_storage.
size() ? &m_storage[0] : 0;
155 template <
typename T>
169 return m_storage.
size() ? &m_storage[0] : 0;
174 return m_storage.
size() ? &m_storage[0] : 0;
180 m_resizeOperations(0),
181 m_setElemOperations(0)
188 m_resizeOperations(0),
189 m_setElemOperations(0)
195 m_resizeOperations++;
200 m_storage.
resize(rows*cols);
222 if (m_storage[col+row*m_cols]==0.f)
227 m_storage[row*m_cols+col] += val;
235 m_setElemOperations++;
236 m_storage[row*m_cols+col] = val;
241 m_setElemOperations++;
244 m_storage[row*m_cols+col] *= val;
253 for (
int row=0;row<rows();row++)
255 for (
int col=0;col<row;col++)
257 setElem(col,row, (*
this)(row,col));
267 return m_storage[col+row*m_cols];
287 for (
int row=0;row<rows();row++)
297 printf(
"%s ---------------------\n",msg);
298 for (
int i=0;i<rows();i++)
301 for (
int j=0;j<cols();j++)
303 printf(
"%2.1f\t",(*
this)(i,j));
306 printf(
"\n---------------------\n");
313 m_rowNonZeroElements1.
resize(rows());
314 for (
int i=0;i<rows();i++)
316 m_rowNonZeroElements1[i].
resize(0);
317 for (
int j=0;j<cols();j++)
319 if ((*
this)(i,j)!=0.f)
331 for (
int i=0;i<m_cols;i++)
332 for (
int j=0;j<m_rows;j++)
352 for (
int j=0; j < res.cols(); ++j)
355 for (
int i=0; i < res.rows(); ++i)
364 for (
int v=0;v<rows();v++)
369 dotProd+=w*other(v,j);
376 res.setElem(i,j,dotProd);
387 for (
int i = 0;i<numRows;i++)
390 for (
int j = 0;j<numRowsOther;j++)
399 addElem(row+i,col+j,sum);
408 btAssert (numRows>0 && numRowsOther>0 && B && C);
410 for (
int i = 0;i<numRows;i++)
413 for (
int j = 0;j<numRowsOther;j++)
429 void setSubMatrix(
int rowstart,
int colstart,
int rowend,
int colend,
const T value)
431 int numRows = rowend+1-rowstart;
432 int numCols = colend+1-colstart;
434 for (
int row=0;row<numRows;row++)
436 for (
int col=0;col<numCols;col++)
438 setElem(rowstart+row,colstart+col,value);
447 for (
int row=0;row<block.
rows();row++)
449 for (
int col=0;col<block.
cols();col++)
451 setElem(rowstart+row,colstart+col,block(row,col));
459 for (
int row=0;row<block.
rows();row++)
461 for (
int col=0;col<block.
cols();col++)
463 setElem(rowstart+row,colstart+col,block[row]);
472 for (
int i=0;i<rows();i++)
473 for (
int j=0;j<cols();j++)
492 #ifdef BT_DEBUG_OSTREAM 493 template <
typename T>
494 std::ostream& operator<< (std::ostream& os, const btMatrixX<T>& mat)
499 for (
int i=0;i<mat.rows();i++)
501 for (
int j=0;j<mat.cols();j++)
503 os << std::setw(12) << mat(i,j);
506 os << std::endl <<
" ";
513 template <
typename T>
514 std::ostream& operator<< (std::ostream& os, const btVectorX<T>& mat)
519 for (
int i=0;i<mat.rows();i++)
521 os << std::setw(12) << mat[i];
523 os << std::endl <<
" ";
531 #endif //BT_DEBUG_OSTREAM 544 #ifdef BT_USE_DOUBLE_PRECISION 545 #define btVectorXu btVectorXd 546 #define btMatrixXu btMatrixXd 548 #define btVectorXu btVectorXf 549 #define btMatrixXu btMatrixXf 550 #endif //BT_USE_DOUBLE_PRECISION 554 #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)
const T * getBufferPointer() const
btAlignedObjectArray< T > m_storage
btAlignedObjectArray< T > m_storage
bool operator()(const int &a, const int &b) const
The btAlignedObjectArray template class uses a subset of the stl::vector interface for its methods It...
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...
int size() const
return the number of elements in the array
void setSubMatrix(int rowstart, int colstart, int rowend, int colend, const btVectorX< T > &block)
T * getBufferPointerWritable()
void btSetZero(T *a, int n)
btMatrixX< double > btMatrixXd
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)
btMatrixX< float > btMatrixXf
void resize(int newsize, const T &fillData=T())
void rowComputeNonZeroElements() const
void setElem(btMatrixXd &mat, int row, int col, double val)
const T * getBufferPointer() const
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)
btMatrixX transpose() const
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)