1 #ifndef UTIL_MATH___MATRIX__HPP
2 #define UTIL_MATH___MATRIX__HPP
151 template <
class T,
class U>
158 template <
class T,
class U>
198 template <
class T,
class U>
205 template <
class T,
class U>
212 template <
class T,
class U>
219 template <
class T,
class U>
226 template <
class T,
class U>
233 template <
class T,
class U>
240 template <
class T,
class U>
261 template <
class T,
class U>
268 template <
class T,
class U>
327 return m_Data.begin();
341 return m_Data.begin();
375 return m_Data[
i * m_Cols + j];
385 return m_Data[
i * m_Cols + j];
393 if (new_cols == m_Cols && new_rows >= m_Rows) {
395 m_Data.resize(new_rows * new_cols,
val);
399 TData new_data(new_rows * new_cols,
val);
400 size_t i =
min(new_rows, m_Rows);
401 size_t j =
min(new_cols, m_Cols);
403 for (
size_t r = 0;
r <
i; ++
r) {
404 for (
size_t c = 0; c < j; ++c) {
405 new_data[
r * new_cols + c] = m_Data[
r * m_Cols + c];
409 new_data.swap(m_Data);
420 m_Data.resize(m_Rows * m_Cols,
val);
430 for (
size_t i = 0;
i < m_Rows; ++
i) {
431 m_Data[
i * m_Cols +
i] =
T(1);
442 for (
size_t i = 0;
i < m_Rows; ++
i) {
443 m_Data[
i * m_Cols +
i] =
T(1);
454 for (
size_t i = 0;
i < m_Rows; ++
i) {
455 m_Data[
i * m_Cols +
i] =
val;
466 for (
size_t i = 0;
i < m_Rows; ++
i) {
467 m_Data[
i * m_Cols +
i] =
val;
475 TData new_data(m_Cols * m_Rows);
477 for (
size_t i = 0;
i < m_Rows; ++
i) {
478 for (
size_t j = 0; j < m_Cols; ++j) {
479 new_data[j * m_Cols +
i] = m_Data[
i * m_Cols + j];
483 m_Data.swap(new_data);
484 swap(m_Rows, m_Cols);
491 size_t i_offs =
i * m_Cols;
492 size_t j_offs = j * m_Cols;
494 for (
size_t c = 0; c < m_Cols; ++c) {
495 swap(m_Data[i_offs + c], m_Data[j_offs + c] );
503 m_Data.swap(
M.m_Data);
504 swap(m_Cols,
M.m_Cols);
505 swap(m_Rows,
M.m_Rows);
513 for (++
r;
r < m_Rows; ++
r) {
514 for (
size_t c = 0; c < m_Cols; ++c) {
515 m_Data[(
r - 1) * m_Cols + c] = m_Data[
r * m_Cols + c];
520 m_Data.resize(m_Rows * m_Cols);
528 for (
size_t r = 0;
r < m_Rows; ++
r) {
529 for (
size_t c = col + 1; c < m_Cols; ++c) {
530 m_Data[
r * m_Cols + c - 1] = m_Data[
r * m_Cols + c];
534 Resize(m_Rows, m_Cols - 1);
546 template <
class T,
class U>
560 for ( ; res_iter != res_end; ++res_iter, ++m0_iter, ++m1_iter) {
561 *res_iter = *m0_iter + *m1_iter;
568 template <
class T,
class U>
580 for ( ;
mod; --
mod, ++m0_iter, ++m1_iter) {
581 *m0_iter += *m1_iter;
584 for ( ; m0_iter != m0_end; ) {
585 *m0_iter++ += *m1_iter++;
586 *m0_iter++ += *m1_iter++;
587 *m0_iter++ += *m1_iter++;
588 *m0_iter++ += *m1_iter++;
599 template <
class T,
class U>
612 for ( ; res_iter != res_end; ++res_iter, ++m0_iter, ++m1_iter) {
613 *res_iter = *m0_iter - *m1_iter;
620 template <
class T,
class U>
631 for ( ; m0_iter != m0_end; ++m0_iter, ++m1_iter) {
632 *m0_iter -= *m1_iter;
652 for ( ; res_iter != res_end; ++res_iter, ++m0_iter) {
653 *res_iter = *m0_iter *
val;
670 for ( ; res_iter != res_end; ++res_iter, ++m0_iter) {
671 *res_iter = *m0_iter *
val;
688 for ( ; res_iter != res_end; ++res_iter, ++m0_iter) {
689 *res_iter = *m0_iter *
val;
706 for ( ; res_iter != res_end; ++res_iter, ++m0_iter) {
707 *res_iter = *m0_iter *
val;
724 for ( ; res_iter != res_end; ++res_iter, ++m0_iter) {
725 *res_iter = *m0_iter *
val;
742 for ( ; res_iter != res_end; ++res_iter, ++m0_iter) {
743 *res_iter = *m0_iter *
val;
757 for ( ; m0_iter != m0_end; ++m0_iter) {
774 for ( ; m0_iter != m0_end; ++m0_iter) {
782 template <
class T,
class U>
789 vector< TPromote > res(m.
GetRows(), TPromote(0));
793 res[
r] += m(
r,
i) * v[
i];
801 template <
class T,
class U>
808 vector<TPromote> res(m.
GetCols(), TPromote(0));
810 for (
size_t c = 0; c < m.
GetCols(); ++c) {
812 res[c] += m(
i,c) * v[
i];
820 template <
class T,
class U>
831 for (
size_t c = 0; c < m1.
GetCols(); ++c) {
833 res(
r,c) += m0(
r,
i) * m1(
i,c);
841 const vector<T>& lhs = m0.
GetData();
842 const vector<U>& rhs = m1.
GetData();
843 size_t col_mod = m0.
GetCols() % 4;
848 for (
size_t c = 0; c < m1.
GetCols(); ++c) {
861 t0 += m0.
GetData()[r_offs + 2] * m1(2,c);
864 t0 += m0.
GetData()[r_offs + 1] * m1(1,c);
867 t0 += m0.
GetData()[r_offs + 0] * m1(0,c);
873 t0 += lhs[r_offs +
i + 0] * m1(
i + 0, c);
874 t1 += lhs[r_offs +
i + 1] * m1(
i + 1, c);
878 res(
r,c) = t0 + t1 + t2 + t3;
887 template <
class T,
class U>
902 template <
class T,
class U>
914 if (m0[
i] != m1[
i]) {
923 template <
class T,
class U>
936 for (
size_t i = 0;
i <
M.GetRows(); ++
i) {
937 for (
size_t j = 0; j <
M.GetCols(); ++j) {
959 while(getline(is, line)) {
961 if (line.empty() || line[0] ==
'#') {
971 row.push_back(entry);
973 if (
A.GetCols() == 0) {
974 A.Resize(
A.GetCols(),
row.size());
976 if (
row.size() !=
A.GetCols()) {
983 A.Resize(
A.GetRows() + 1,
A.GetCols());
984 for (
int i = 0;
i <
A.GetCols(); ++
i) {
985 A(
A.GetRows() - 1,
i) =
row[
i];
void Resize(size_t i, size_t j, T val=T())
resize this matrix, filling the empty cells with a known value
TData & GetData()
retrieve the data associated with this matrix
void Diagonal(size_t size, T val)
make this matrix a diagonal matrix of a given size, with a given value on the diagonal
void SwapRows(size_t i, size_t j)
swap two rows in the matrix
const T & operator[](size_t i) const
operator[] for raw data indexing
void Swap(CNcbiMatrix< T > &M)
swap two matrices efficiently
const_iterator begin() const
void Identity()
make this matrix an identity matrix
void Set(T val)
set all values in the matrix to a known value
void RemoveRow(size_t i)
remove a given row in the matrix
size_t m_Rows
size of this matrix
void Identity(size_t size)
make this matrix an identity matrix of a given size
size_t GetRows() const
get the number of rows in this matrix
TData::const_iterator const_iterator
void RemoveCol(size_t i)
remove a given column in the matrix
const T & operator()(size_t i, size_t j) const
operator() for row/column indexing
size_t GetCols() const
get the number of columns in this matrix
CNcbiMatrix(size_t r, size_t c, T val=T())
void Diagonal(T val)
make this matrix a diagonal matrix, with a given value on the diagonal
void Transpose()
transpose this matrix
CNcbiMatrix()
default ctor
const TData & GetData() const
const_iterator end() const
iterator begin()
iterators
TData m_Data
the data strip we use
Include a standard set of the NCBI C++ Toolkit most basic headers.
void swap(NCBI_NS_NCBI::pair_base_member< T1, T2 > &pair1, NCBI_NS_NCBI::pair_base_member< T1, T2 > &pair2)
#define NCBI_THROW(exception_class, err_code, message)
Generic macro to throw an exception, given the exception class, error code and message string.
NCBI_PROMOTE(T, U) operator*(const CVect2< T > &v1
#define END_NCBI_SCOPE
End previously defined NCBI scope.
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
IO_PREFIX::ostream CNcbiOstream
Portable alias for ostream.
IO_PREFIX::istream CNcbiIstream
Portable alias for istream.
static string IntToString(int value, TNumToStringFlags flags=0, int base=10)
Convert int to string.
CNcbiMatrix< NCBI_PROMOTE(T, size_t) > operator*(const CNcbiMatrix< T > &, size_t)
global multiplication: matrix * scalar this is a hack, as MSVC doesn't support partial template speci...
CNcbiMatrix< T > & operator+=(CNcbiMatrix< T > &, const CNcbiMatrix< U > &)
global addition: matrix += matrix
CNcbiMatrix< T > & operator*=(CNcbiMatrix< T > &, const CNcbiMatrix< U > &)
global multiplication: matrix *= matrix
CNcbiIstream & operator>>(CNcbiIstream &is, CNcbiMatrix< T > &M)
global operators
CNcbiMatrix< T > & operator-=(CNcbiMatrix< T > &, const CNcbiMatrix< U > &)
global subtraction: matrix -= matrix
bool operator==(const CNcbiMatrix< T > &, const CNcbiMatrix< U > &)
global comparison: matrix == matrix
CNcbiMatrix< T > & operator/=(CNcbiMatrix< T > &, T)
global division: matrix /= matrix
CNcbiOstream & operator<<(CNcbiOstream &os, const CNcbiMatrix< T > &M)
stream output.
CNcbiMatrix< NCBI_PROMOTE(T, U) > operator-(const CNcbiMatrix< T > &, const CNcbiMatrix< U > &)
global subtraction: matrix - matrix
CNcbiMatrix< NCBI_PROMOTE(T, U) > operator+(const CNcbiMatrix< T > &, const CNcbiMatrix< U > &)
global addition: matrix + matrix
bool operator!=(const CNcbiMatrix< T > &, const CNcbiMatrix< U > &)
global comparison: matrix != matrix
const struct ncbi::grid::netcache::search::fields::SIZE size
double r(size_t dimension_, const Int4 *score_, const double *prob_, double theta_)
#define row(bind, expected)