矩阵类(基本)

以下为矩阵类

  1 namespace KUNKUN_MATRIX{
  2     const int MOD = 1000000007;
  3     template<class E>
  4     class Matrix{
  5     public:
  6         Matrix(size_t _m,size_t _n);
  7         Matrix(const Matrix& copy);
  8         Matrix operator*(const Matrix &b);
  9         E* operator[](size_t i);
 10         Matrix& operator=(const Matrix& copy);
 11         Matrix operator^(size_t e);
 12         Matrix operator+(const Matrix& b) const;
 13         Matrix operator-(const Matrix& b) const;
 14         Matrix transpose() const;
 15         ~Matrix();
 16         void output() const;
 17     private:
 18         size_t m,n;
 19         E *mat;
 20     };
 21
 22     template<class E>
 23     void Matrix<E>::output() const{
 24         for(size_t i=0;i<m;i++){
 25             for(size_t j=0;j<n;j++){
 26                 cout << mat[i*n+j] << " ";
 27             }
 28             cout << endl;
 29         }
 30     }
 31
 32     template<class E>
 33     Matrix<E>::Matrix(size_t _m,size_t _n):m(_m),n(_n) {
 34         mat = new E[m*n];
 35         memset(mat,0,sizeof(E)*m*n);
 36     }
 37
 38     template<class E>
 39     E* Matrix<E>:: operator[] (size_t i) {
 40         return mat+i*n;
 41     }
 42
 43     template<class E>
 44     Matrix<E>& Matrix<E>::operator =(const Matrix& copy) {
 45         m = copy.m;
 46         n = copy.n;
 47         mat = new E[m*n];
 48         memcpy(mat,copy.mat,sizeof(E)*m*n);
 49         return *this;
 50     }
 51
 52     template<class E>
 53     Matrix<E>::Matrix(const Matrix& copy):m(copy.m),n(copy.n) {
 54         mat = new E[m*n];
 55         memcpy(mat,copy.mat,sizeof(E)*m*n);
 56     }
 57
 58     template<class E>
 59     Matrix<E> Matrix<E>::operator*(const Matrix &b) {
 60         if( n!=b.m ) {
 61             throw runtime_error("This two matrix cannot be multiplied!");
 62         }
 63         Matrix<E> res(m,b.n);
 64         for(size_t i=0;i<m;i++){
 65             for(size_t k=0;k<b.m;k++) if( mat[i*n+k] ){
 66                 for(size_t j=0;j<b.n;j++) if( b.mat[k*b.n+j] ){
 67                     res[i][j] += mat[i*n+k]*b.mat[k*b.n+j];
 68                     res[i][j] %= MOD;
 69                 }
 70             }
 71         }
 72         return res;
 73     }
 74
 75     template<class E>
 76     Matrix<E>::~Matrix(){
 77         delete [] mat;
 78     }
 79
 80     template<class E>
 81     Matrix<E> Matrix<E>::operator^(size_t e){
 82         if( m!=n ) {
 83             throw runtime_error("This matrix is not a square matrix!");
 84         }
 85         Matrix res(m,m);
 86         Matrix x(*this);
 87         for(size_t i=0;i<m;i++) res[i][i] = 1;
 88         for( ; e ; e>>=1 ) {
 89             if( e&1 ) res = res * x;
 90             x = x * x;
 91         }
 92         return res;
 93     }
 94
 95     template<class E>
 96     Matrix<E> Matrix<E>::operator+(const Matrix& b) const{
 97         if(n!=b.n||m!=b.m) {
 98             throw runtime_error("This two matrix is not in same size!");
 99         }
100         Matrix<E> res(m,n);
101         for(size_t i=0;i<m*n;i++){
102             res.mat[i] = mat[i] + b.mat[i];
103         }
104         return res;
105     }
106
107     template<class E>
108     Matrix<E> Matrix<E>::operator-(const Matrix& b) const{
109         if(n!=b.n||m!=b.m) {
110             throw runtime_error("This two matrix is not in same size!");
111         }
112         Matrix<E> res(m,n);
113         for(size_t i=0;i<m*n;i++){
114             res.mat[i] = mat[i] - b.mat[i];
115         }
116         return res;
117     }
118
119     template<class E>
120     Matrix<E> Matrix<E>::transpose() const{
121         Matrix res(n,m);
122         for(int i=0;i<m;i++){
123             for(int j=0;j<n;j++){
124                 res.mat[j*n+i] = mat[i*n+j];
125             }
126         }
127         return res;
128     }
129 }
时间: 2024-11-12 04:00:08

矩阵类(基本)的相关文章

矩阵类的python实现

科学计算离不开矩阵的运算.当然,python已经有非常好的现成的库:numpy. 我写这个矩阵类,并不是打算重新造一个轮子,只是作为一个练习,记录在此. 注:这个类的函数还没全部实现,慢慢在完善吧. 全部代码: 1 import copy 2 3 class Matrix: 4 '''矩阵类''' 5 def __init__(self, row, column, fill=0.0): 6 self.shape = (row, column) 7 self.row = row 8 self.co

矩阵及其运算(一):创建一个矩阵类

在VB.NET中可以通过一个数组(Array)来简单表示矩阵,为实现更多功能也可以用类(Class)来表示. 矩阵的数学定义:由m*n个数排成的m行n列的数表 Public Class Matrix Private TableData(,) As Double Private RowLength, ColLength As Integer '矩阵的行长度 Public ReadOnly Property Row() Get Return RowLength End Get End Propert

[Android] 使用Matrix矩阵类对图像进行缩放、旋转、对比度、亮度处理

    前一篇文章讲述了Android拍照.截图.保存并显示在ImageView控件中,该篇文章继续讲述Android图像处理技术,主要操作包括:通过打开相册里的图片,使用Matrix对图像进行缩放.旋转.移动.对比度.亮度.饱和度操作,希望对大家有所帮助. 一. 显示打开图片     首先,设置activity_main.xml布局如下所示: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android

实用矩阵类(Matrix)(带测试)

引言: 无意间看到国外一个网站写的Matrix类,实现了加减乘除基本运算以及各自的const版本等等,功能还算比较完善,,于是记录下来,以备后用: 1 #ifndef MATRIX_H 2 #define MATRIX_H 3 4 #include <iostream> 5 #include <functional> 6 #include <algorithm> 7 8 using namespace std; 9 10 template <size_t Rows

泛型矩阵类

1.GenericMatrix类 public abstract class GenericMatrix<E extends Number> { /** * Abstract method for adding two elements of the matrices * @param o1 * @param o2 * @return */ protected abstract E add(E o1, E o2); /** * Abstract method for myltiplying t

OpenCV中Rect矩阵类

成员变量x.y.width.height,分别为左上角点的坐标和矩形的宽和高. 常用的成员函数有: Size()返回值为一个Size area()返回矩形的面积 contains(Point)用来判断点是否在矩形内 inside(Rect)函数判断矩形是否在该矩形内 tl()返回左上角点坐标 br()返回右下角点坐标. // 移动矩阵 Rect rectShift = rect + point; // 缩放矩阵 Rect rectScale = rect + size; // 求两矩阵交集和并集

矩阵类的代码(C++)

The Codes of Matrix Class Matrix.h:#ifndef MATRIX_H#define MATRIX_H #include<iostream> #include<iomanip> #include<cassert> #include<cmath> #include"MatrixTypedef.h"// declare typedef's header file class Matrix{ public: Ma

Young氏矩阵类C++实现代码 算法导论6.3

个人总结: 1.int **p和 int a[M][N]之间的区别: 1) int **指向指针的指针:而后者的类型是数组名,类型为 int (*)[N],即指向的是整个一行. 2) (a+1) 表示地址增加M*sizeof(int),需要注意的一点是a[i]是第i行开头的地址,&a和a的值是一样的.数组名是附带大小属性的,而指针是一个存储了地址的变量.特意去看了一下声明数组的汇编代码,其中一条指令是mov %gs:0x14,%eax  (数组大小20即0x14),最后也貌似也会检查一下数组是否

矩阵类

class MatrixBase{ int rows, cols;public: MatrixBase(int the_rows, int the_cols) :rows(the_rows), cols(the_cols){} int GetRows()const { return rows; } int GetCols()const { return cols; } virtual double getElement(int r, int c)const = 0; void show() {