⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmat_14.cc

📁 这是一个从音频信号里提取特征参量的程序
💻 CC
字号:
// file: $isip/class/math/matrix/MMatrix/mmat_14.cc// version: $Id: mmat_14.cc,v 1.24 2002/02/27 20:54:30 alphonso Exp $//// isip include files//#include "MMatrixMethods.h"#include "MMatrix.h"// method: sum//// arguments://  const MMatrix<TScalar, TIntegral>& this: (input) class operand//// return: a value containing the sum of the elements//template<class TScalar, class TIntegral>TIntegral MMatrixMethods::sum(const MMatrix<TScalar, TIntegral>& this_a) {  // declare local variables  //  long nrows = this_a.nrows_d;  long ncols = this_a.ncols_d;  TIntegral sum = 0;  // type: non-SYMMETRIC  //  if (this_a.type_d != Integral::SYMMETRIC) {    sum = this_a.m_d.sum();  }    // type: SYMMETRIC  //    else {    // check the dimension    //    if ((nrows == 0) && (ncols == 0)) {      return sum;    }    // compute the sum of the lower-triangular elements in two parts:    // off-diagonal and diagonal values.    //    TIntegral sum_diag = this_a.m_d(0);    for (long row = 1, index = 1; row < nrows; row++) {      for (long col = 0; col < row; col++) {	sum += this_a.m_d(index++);      }      sum_diag += this_a.m_d(index++);    }    // the correct sum can now be computed by adding these two pieces    //    sum = (TIntegral)2 * sum + sum_diag;  }  // exit gracefully  //    return sum;}// explicit instantiations//template ISIP_TEMPLATE_T1   MMatrixMethods::sum<ISIP_TEMPLATE_TARGET>(const MMatrix<ISIP_TEMPLATE_TARGET>&);// method: sumSquare//// arguments://  const MMatrix<TScalar, TIntegral>& this: (input) class operand//// return: a value containing the sum of the squares of the elements//template<class TScalar, class TIntegral>TIntegralMMatrixMethods::sumSquare(const MMatrix<TScalar, TIntegral>& this_a) {  // declare local variables  //  long nrows = this_a.nrows_d;  long ncols = this_a.ncols_d;  TIntegral sum = 0;  // type: non-SYMMETRIC  //  if (this_a.type_d != Integral::SYMMETRIC) {    sum = this_a.m_d.sumSquare();  }    // type: SYMMETRIC  //    else {    // check the dimension    //    if ((nrows == 0) && (ncols == 0)) {      return sum;    }    // compute the sum of the lower-triangular elements in two parts:    // off-diagonal and diagonal values.    //    TIntegral sum_diag = this_a.m_d(0) * this_a.m_d(0);    for (long row = 1, index = 1; row < nrows; row++) {      for (long col = 0; col < row; col++) {	sum += this_a.m_d(index) * this_a.m_d(index);	index++;      }      sum_diag += this_a.m_d(index) * this_a.m_d(index);      index++;    }    // the correct sum can now be computed by adding these two pieces    //    sum = (TIntegral)2 * sum + sum_diag;  }  // exit gracefully  //    return sum;}// explicit instantiations//template ISIP_TEMPLATE_T1   MMatrixMethods::sumSquare<ISIP_TEMPLATE_TARGET>(const MMatrix<ISIP_TEMPLATE_TARGET>&);// method: var//// arguments://  const MMatrix<TScalar, TIntegral>& this: (input) class operand//// return: a value containing the variance //// this method calculates the variance of all elements in the matrix by// considering it as a 1-D array.//template<class TScalar, class TIntegral>TIntegral MMatrixMethods::var(const MMatrix<TScalar, TIntegral>& this_a) {  // declare local variables for the number of elements and the mean  //  long num_elements = this_a.nrows_d * this_a.ncols_d;  TIntegral mean = this_a.mean();    // we can compute the variance by computing the sum of squares  // and subtracting the squared mean.  //  TIntegral var =  (TIntegral)(this_a.sumSquare() / (TIntegral)num_elements - mean * mean);  return var;}// explicit instantiations//template ISIP_TEMPLATE_T1MMatrixMethods::var<ISIP_TEMPLATE_TARGET>(const MMatrix<ISIP_TEMPLATE_TARGET>&);// method: sumRow//// arguments://  const MMatrix<TScalar, TIntegral>& this: (input) class operand//  long row: (input) row index//// return: a TIntegral value containing the sum//// this method calculates the sum of all elements in a given row.//template<class TScalar, class TIntegral>TIntegral MMatrixMethods::sumRow(const MMatrix<TScalar, TIntegral>& this_a, 				 long row_a) {  // check the arguments  //  if ((row_a < 0) || (row_a > this_a.nrows_d)) {    this_a.debug(L"this_a");        return Error::handle(name(), L"sumRow", Error::ARG, __FILE__, __LINE__);  }  // declare local variable  //  TIntegral sum = 0;    // type: DIAGONAL  //  this is easy since we only need one element  //  if (this_a.type_d == Integral::DIAGONAL) {    sum = this_a.m_d(row_a);  }  // type: FULL, SYMMETRIC, LOWER_TRIANGULAR, UPPER_TRIANGULAR  //  else if ((this_a.type_d == Integral::FULL) ||	   (this_a.type_d == Integral::SYMMETRIC) ||	   (this_a.type_d == Integral::LOWER_TRIANGULAR) ||	   (this_a.type_d == Integral::UPPER_TRIANGULAR)) {    // loop over the entire row    //    long first_col = this_a.startColumn(row_a, this_a.type_d);    long last_col = this_a.stopColumn(row_a, this_a.type_d);    for (long col = first_col; col <= last_col; col++) {      sum += this_a.getValue(row_a, col);    }    // for symmetric matrix, we will also need to add the elements    // after the diagonal element for specified row     //    if (this_a.type_d == Integral::SYMMETRIC) {      for (long col = last_col + 1; col < this_a.ncols_d; col++) {	sum += this_a.getValue(row_a, col);      }    }  }  // type: SPARSE  //    else {    // loop over number of elements: only add elements in the given row    //    long num_elements = this_a.m_d.length();        for (long elem = 0; elem < num_elements; elem++) {      if (row_a == this_a.row_index_d(elem)) {	sum += this_a.m_d(elem);      }    }  }  // exit gracefully  //  return sum;}// explicit instantiations//template ISIP_TEMPLATE_T1   MMatrixMethods::sumRow<ISIP_TEMPLATE_TARGET>(const MMatrix<ISIP_TEMPLATE_TARGET>&, long);// method: sumColumn//// arguments://  const MMatrix<TScalar, TIntegral>& this: (input) class operand//  long col: (input) col index//// return: a TIntegral value containing the sum//// this method calculates the sum of all elements in a given col.//template<class TScalar, class TIntegral>TIntegral MMatrixMethods::sumColumn(const MMatrix<TScalar, TIntegral>& this_a, 				    long col_a) {  // check the arguments  //  if ((col_a < 0) || (col_a > this_a.ncols_d)) {    this_a.debug(L"this_a");        return Error::handle(name(), L"sumColumn", Error::ARG, __FILE__, __LINE__);  }  // declare local variable  //  TIntegral sum = 0;    // type: DIAGONAL  //  this is easy since we only need one element  //  if (this_a.type_d == Integral::DIAGONAL) {    sum = this_a.m_d(col_a);  }  // type: FULL, SYMMETRIC, LOWER_TRIANGULAR, UPPER_TRIANGULAR  //  the easiest way to do this is to fetch the entire col as a vector  //  else if ((this_a.type_d == Integral::FULL) ||	   (this_a.type_d == Integral::SYMMETRIC) ||	   (this_a.type_d == Integral::LOWER_TRIANGULAR) ||	   (this_a.type_d == Integral::UPPER_TRIANGULAR)) {    // loop over the entire column    //    long first_row = this_a.startRow(col_a, this_a.type_d);    long last_row = this_a.stopRow(col_a, this_a.type_d);    for (long row = first_row; row <= last_row; row++) {      sum += this_a.getValue(row, col_a);    }    // for symmetric matrix, we also need to add the elements above    // diagonal for the particular column    //    if (this_a.type_d == Integral::SYMMETRIC) {      for (long row = 0; row < first_row; row++) {	sum += this_a.getValue(row, col_a);      }    }  }  // type: SPARSE  //    else {    // loop over number of elements: only add elements in the given col    //    long num_elements = this_a.m_d.length();        for (long elem = 0; elem < num_elements; elem++) {      if (col_a == this_a.col_index_d(elem)) {	sum += this_a.m_d(elem);      }    }  }  // exit gracefully  //  return sum;}// explicit instantiations//template ISIP_TEMPLATE_T1   MMatrixMethods::sumColumn<ISIP_TEMPLATE_TARGET>(const MMatrix<ISIP_TEMPLATE_TARGET>&, long);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -