diff --git a/vcg/math/matrix.h b/vcg/math/matrix.h
index ff50ff45..6eac53eb 100644
--- a/vcg/math/matrix.h
+++ b/vcg/math/matrix.h
@@ -22,6 +22,9 @@
****************************************************************************/
/***************************************************************************
$Log: not supported by cvs2svn $
+Revision 1.6 2006/04/11 08:09:35 zifnab1974
+changes necessary for gcc 3.4.5 on linux 64bit. Please take note of case-sensitivity of filenames
+
Revision 1.5 2005/12/12 11:25:00 ganovelli
added diagonal matrix, outer produce and namespace
@@ -95,10 +98,12 @@ namespace vcg{
{
_rows = m;
_columns = n;
- _data = new ScalarType[m*n];
- unsigned int i;
- for (i=0; i<_rows*_columns; i++)
- _data[i] = values[i];
+ unsigned int dim = m*n;
+ _data = new ScalarType[dim];
+ memcpy(_data, values, dim*sizeof(ScalarType));
+ //unsigned int i;
+ //for (i=0; i<_rows*_columns; i++)
+ // _data[i] = values[i];
};
/*!
@@ -275,7 +280,7 @@ namespace vcg{
/*!
* Get the j-th column on the matrix.
* \param j the column index.
- * \return the reference to the column elements.
+ * \return the reference to the column elements. This pointer must be deallocated by the caller.
*/
TYPE* GetColumn(const unsigned int j)
{
@@ -290,7 +295,7 @@ namespace vcg{
/*!
* Get the i-th row on the matrix.
* \param i the column index.
- * \return the reference to the row elements.
+ * \return the reference to the row elements. This pointer must be deallocated by the caller.
*/
TYPE* GetRow(const unsigned int i)
{
@@ -302,6 +307,40 @@ namespace vcg{
return v;
};
+ /*!
+ * Swaps the values of the elements between the i-th and the j-th column.
+ * \param i the index of the first column
+ * \param j the index of the second column
+ */
+ void SwapColumns(const unsigned int i, const unsigned int j)
+ {
+ assert(0<=i && i<_columns);
+ assert(0<=j && j<_columns);
+ if (i==j)
+ return;
+
+ unsigned int r, e0, e1;
+ for (r=0, e0=i, e1=j; r<_rows; r++, e0+=_columns, e1+=_columns)
+ std::swap(_data[e0], _data[e1]);
+ };
+
+ /*!
+ * Swaps the values of the elements between the i-th and the j-th row.
+ * \param i the index of the first row
+ * \param j the index of the second row
+ */
+ void SwapRows(const unsigned int i, const unsigned int j)
+ {
+ assert(0<=i && i<_rows);
+ assert(0<=j && j<_rows);
+ if (i==j)
+ return;
+
+ unsigned int r, e0, e1;
+ for (r=0, e0=i*_columns, e1=j*_columns; r<_columns; r++, e0++, e1++)
+ std::swap(_data[e0], _data[e1]);
+ };
+
/*!
* Assignment operator
* \param m ...
@@ -397,7 +436,7 @@ namespace vcg{
/*!
* Matrix multiplication: calculates the cross product.
- * \param reference to the matrix to multiply by
+ * \param m reference to the matrix to multiply by
* \return the matrix product
*/
Matrix operator*(const Matrix &m)
@@ -418,6 +457,23 @@ namespace vcg{
};
/*!
+ * Matrix-Vector product. Computes the product of the matrix by the vector v.
+ * \param v reference to the vector to multiply by
+ * \return the matrix-vector product. This pointer must be deallocated by the caller
+ */
+ ScalarType* operator*(const ScalarType v[])
+ {
+ ScalarType *result = new ScalarType[_rows];
+ memset(result, 0, _rows*sizeof(ScalarType));
+ unsigned int r, c, i;
+ for (r=0, i=0; r<_rows; r++)
+ for (c=0; c<_columns; c++, i++)
+ result[r] += _data[i]*v[c];
+
+ return result;
+ };
+
+ /*!
* Matrix multiplication: calculates the cross product.
* \param reference to the matrix to multiply by
* \return the matrix product
@@ -565,7 +621,7 @@ namespace vcg{
{
assert(j>=0 && j<_columns);
unsigned int i, p;
- for (i=0, p=0; i<_rows; i++, p+=_columns)
+ for (i=0, p=j; i<_rows; i++, p+=_columns)
_data[p] = v[i];
};
@@ -638,7 +694,7 @@ namespace vcg{
{
printf("[\t");
for (j=0; j<_columns; j++)
- printf("%g\t", _data[p+j]);
+ printf("%f\t", _data[p+j]);
printf("]\n");
}
@@ -656,6 +712,9 @@ namespace vcg{
ScalarType *_data;
};
+ typedef vcg::ndim::Matrix MatrixMNd;
+ typedef vcg::ndim::Matrix MatrixMNf;
+
/*! @} */
template