`
viMory
  • 浏览: 58134 次
  • 性别: Icon_minigender_1
  • 来自: 土卫六
最近访客 更多访客>>
社区版块
存档分类
最新评论

Matrix类的一种C++实现

    博客分类:
  • 类C
阅读更多

  功能:构建一个Matrix,拥有转置、矩阵加、矩阵减、矩阵乘

  #ifndef Matrix_Wang
  #define Matrix_Wang
  #include "xcept.h"
  #include <iostream>
  using namespace std;
  template <class T> class Matrix
  {
      friend ostream &operator << (ostream &, const Matrix<T>  &);
    public:
      Matrix(int r = 0, int c = 0);
      Matrix(const Matrix<T>  &m); // copy constructor
      Matrix(const void *elem, int r, int c); // zhixiwang
      ~Matrix()
      {
          delete []element;
      };
      int Rows()const
      {
          return rows;
      }
      int Columns()const
      {
          return cols;
      }
      T &operator()(int i, int j)const;
      Matrix < T >  &operator = (const Matrix < T >  &m);
      Matrix < T > operator + ()const; // unary +
      Matrix < T > operator + (const Matrix < T >  &m)const;
      Matrix < T > operator - ()const;
      // unary minus
      Matrix < T > operator - (const Matrix < T >  &m)const;
      Matrix < T > operator *(const Matrix < T >  &m)const;
      Matrix < T >  &operator += (const T &x);
    private:
      int rows, cols;
      // matrix dimensions
      T *element; // element array
  };
  template <class T> Matrix<T>::Matrix(int r, int c)
  {
      // Matrix constructor.
      // validate r and c
      if (r<0 || c<0)
        throw BadInitializers();
      if ((!r || !c) && (r || c))
        throw BadInitializers();
      // create the matrix
      rows = r;
      cols = c;
      element = new T[r *c];
  }  // zhixiwang
  template <class T> Matrix<T>::Matrix(const void *elem, int r, int c)
  {
      // Matrix constructor.
      // validate r and c
      if (r<0 || c<0)
        throw BadInitializers();
      if ((!r || !c) && (r || c))
        throw BadInitializers();
      // create matrix
      rows = r;
      cols = c;
      element = new T[rows *cols]; // copy each element of m
      T *e = (T*)elem;
      for (int i = 0; i<rows *cols; i++)
        element[i] = e[i];
  } 
  template <class T> Matrix<T>::Matrix(const Matrix<T>  &m)
  {
      // Copy constructor for matrices.
      // create matrix
      rows = m.rows;
      cols = m.cols;
      element = new T[rows *cols]; // copy each element of m
      for (int i = 0; i<rows *cols; i++)
        element[i] = m.element[i];
  } 
  template <class T> Matrix<T>  &Matrix<T>::operator = (const Matrix<T>  &m)
  {
      // Assignment. (*this) = m.
      if (this !=  &m)
      {
          // do not copy to self
          delete []element;
          rows = m.rows;
          cols = m.cols;
          element = new T[rows *cols];
          // copy each element
          for (int i = 0; i<rows *cols; i++)
            element[i] = m.element[i];
      };
      return  *this;
  }
  template <class T> T &Matrix<T>::operator()(int i, int j)const
  {
      // Return a reference to element (i,j).
      if (i<0 || i >= rows || j<0 || j >= cols)
        throw OutOfBounds();
      return element[i *cols + j];
  } 
  template <class T> Matrix<T> Matrix<T>::operator + (const Matrix<T>  &m)
    const
  {
      // Return w = (*this) + m.
      if (rows != m.rows || cols != m.cols)
        throw SizeMismatch();
      // create result matrix w
      Matrix<T> w(rows, cols);
      for (int i = 0; i<rows *cols; i++)
        w.element[i] = element[i] + m.element[i];
      return w;
  } 
  template <class T> Matrix<T> Matrix<T>::operator - (const Matrix<T>  &m)
    const
  {
      // Return (*this) - m.
      if (rows != m.rows || cols != m.cols)
        throw SizeMismatch();
      // create result matrix w
      Matrix<T> w(rows, cols);
      for (int i = 0; i<rows *cols; i++)
        w.element[i] = element[i] - m.element[i];
      return w;
  } 
  template <class T> Matrix<T> Matrix<T>::operator - ()const
  {
      // Return w = -(*this).
      // create result matrix w
      Matrix<T> w(rows, cols);
      for (int i = 0; i<rows *cols; i++)
        w.element[i] =  - element[i];
      return w;
  } 
  template <class T> Matrix<T> Matrix<T>::operator *(const Matrix<T>  &m)const
  {
      // Matrix multiply.  Return w = (*this) * m.
      if (cols != m.rows)
        throw SizeMismatch();
      Matrix<T> w(rows, m.cols); // result matrix
      // define cursors for *this, m, and w
      // and initialize to location of (1,1)
      int ct = 0, cm = 0, cw = 0; // compute w(i,j) for all i and j
      for (int i = 1; i <= rows; i++)
      {
          // compute row i of result
          for (int j = 1; j <= m.cols; j++)
          {
              // compute first term of w(i,j)
              T sum = element[ct] *m.element[cm]; // add in remaining terms
              for (int k = 2; k <= cols; k++)
              {
                  ct++; // next term in row i of *this
                  cm += m.cols; // next in column j of m
                  sum += element[ct] *m.element[cm];
              };
              w.element[cw++] = sum; // save w(i,j)
              // reset to start of row and next column
              ct -= cols - 1;
              cm = j;
          } // reset to start of next row and first column
          ct += cols;
          cm = 0;
      }
      return w;
  }
  template <class T> Matrix<T>  &Matrix<T>::operator += (const T &x)
  {
      // Increment all elements of *this by x.
      for (int i = 0; i<rows *cols; i++)
        element[i] += x;
      return  *this;
  } 
  template <class T> ostream &operator << (ostream &out, const Matrix<T>  &x)
  {
      // Put matrix x into the stream out.
      // One row per line.
      int k = 0; // index into element array
      for (int i = 0; i<x.rows; i++)
      {
          // do row i
          for (int j = 0; j<x.cols; j++)
            out << x.element[k++] << "  ";
          // row i finished
          out << endl;
      };
      return out;
  }
#endif

 

分享到:
评论

相关推荐

    C++实现的Matrix类

    总的来说,这个C++实现的Matrix类为处理各种矩阵运算提供了便利,对于学习和应用线性代数的开发者来说是非常有价值的工具。通过理解和实现这些功能,不仅可以提升C++编程技巧,还能深入理解线性代数的概念。

    c++编写的 矩阵 matrix 类源码

    LUP分解是一种高效的求解线性方程组的方法,同时也可用于求矩阵的逆。LUP分解过程涉及到高斯消元法,将矩阵转换为便于求逆的形式。 LUP分解步骤大致如下: 1. 将矩阵A通过行置换转化为L和U的乘积,其中L是单位下...

    c++实现矩阵类

    C++中的类是一种用户自定义的数据类型,可以封装数据和相关操作。在这个项目中,`Matrix`类会包含矩阵的行数、列数以及存储矩阵元素的二维数组。类定义通常包括构造函数、析构函数、成员变量和成员函数。 2. **...

    c++ matrix类

    在C++编程中,矩阵(Matrix)是一种常见的数据结构,特别是在数学、图形学和科学计算等领域。为了方便处理矩阵操作,开发者通常会自定义一个Matrix类。本篇将深入探讨如何在C++中创建和使用Matrix类,以及涵盖其相关...

    C++实现的非常好的一个矩阵类

    在C++编程中,矩阵是一种常见且重要的数据结构,尤其在科学计算、图像处理和机器学习等领域中。这里我们讨论的是一份由外国人编写的C++矩阵类实现,该类全面支持了线性代数中的基本操作,如矩阵的加法、减法、乘法、...

    Halcon 实现对datamatrix工业二维码识别(包含c++程序)

    DataMatrix是一种二维条码标准,能存储大量数据,广泛应用于制造业、物流等领域。 首先,我们要了解Halcon中的二维码读取模块。Halcon提供了`read_code_2d`操作符,专门用于读取二维条码,包括DataMatrix。此操作符...

    使用C++实现的矩阵类

    本项目提供了一个基于C++实现的矩阵类,它包含了一些基本的矩阵操作,如矩阵转置和矩阵乘法。下面将详细介绍这些知识点。 首先,C++中的类(Class)是面向对象编程的核心概念,它允许我们将数据和操作数据的方法...

    C++ Matrix类

    总结,自定义的C++ Matrix类提供了一种结构化处理矩阵的方法,通过秩计算和高斯消元法解决了矩阵运算中的关键问题。这在数值分析、计算机图形学、机器学习等领域都有广泛的应用。开发者可以根据具体需求扩展此类,...

    matrix_matrix_C++_矩阵_whichv2j_

    "matrix_matrix_C++_矩阵_whichv2j_"这个标题暗示了一个关于C++实现矩阵操作的项目,可能包含矩阵的创建、加法、乘法等基本运算。描述中的"使用引用"和"重载操作符"是实现这一目标的关键技术。 引用在C++中是一种...

    C++用于矩阵处理的头文件

    下面将详细解释如何在C++中实现矩阵类以及如何重载基本运算符。 首先,我们需要创建一个矩阵类(Matrix),它通常包含两个主要部分:矩阵的数据存储和矩阵的操作方法。在C++中,我们可以选择用二维数组或动态分配的...

    DataMatrix动态库源码

    DataMatrix动态库源码是一种用于生成DataMatrix二维条形码的软件开发资源,它由C++语言编写,方便开发者在自己的应用程序中集成DataMatrix码的生成功能。DataMatrix码是一种广泛应用在工业自动化、物流管理、电子...

    BP算法的C++实现

    BP算法,全称为Backpropagation(反向传播)算法,是一种在人工神经网络(Artificial Neural Network, ANN)中广泛使用的训练方法。该算法通过迭代调整权重和阈值,使得网络预测输出与实际目标值之间的误差逐渐减小...

    visual c++ 环境 矩阵实现 c语言 matrix

    在编程领域,矩阵是一种常用的数学结构,特别是在计算机图形学、线性代数和科学计算中。Visual C++ 是 Microsoft 提供的一个集成开发环境(IDE),它支持 C 和 C++ 语言,提供了丰富的功能来帮助开发者编写高效且可...

    ARRAY实现MATRIX运算

    在编程领域,数组(Array)是一种基础且重要的数据结构,用于存储同类型的元素集合。在本主题"ARRAY实现MATRIX运算"中,我们将深入探讨如何利用数组来实现矩阵(Matrix)的运算,特别是针对C++语言的实现。矩阵是...

    C++模板矩阵,实现矩阵的常见运算

    总之,C++模板矩阵提供了一种高效、灵活的方式来实现矩阵的常见运算。通过模板,我们可以创建一个泛型的矩阵类,支持多种数据类型,并通过重载操作符实现矩阵的加、减、乘、除等运算。同时,我们还可以扩展额外的...

    MATRIX 类

    "MATRIX 类"是一种在编程中用于处理矩阵运算的类,它是上一版本的增强和扩展,旨在简化和加速数值计算中的算法实现。矩阵在数学、物理、工程、计算机图形学等多个领域都有广泛应用,因此,一个强大且易用的矩阵类...

    C++实现线性回归

    线性回归是一种基础而重要的统计学方法,常用于预测和建模两个变量之间的关系。在本项目中,我们将探讨如何使用C++编程语言实现线性回归算法,特别地,是针对预测房价的应用场景。C++作为一门高效且灵活的编程语言,...

    C++实现的矩阵类,用于支持各种矩阵运算

    本项目提供了一个C++实现的矩阵类,旨在支持各种矩阵运算,如加法、减法、乘法以及一些基本的矩阵运算,如转置和求逆。下面我们将深入探讨这个矩阵类的实现细节和相关知识点。 1. **类设计**:C++中的类是一种用户...

    C和C++实现矩阵类

    总结来说,C和C++实现矩阵类涉及到以下关键点: 1. 定义矩阵类或结构体,存储矩阵的基本信息。 2. 实现构造函数和其他成员函数,进行矩阵的初始化和操作。 3. 实现矩阵的四则运算,注意兼容性检查。 4. 实现矩阵的...

Global site tag (gtag.js) - Google Analytics