c++实现矩阵乘法

重载*运算符为友元函数。

  1 #include <iostream>
  2 #include <cmath>
  3 using namespace std;
  4
  5 class Matrix{
  6     public:
  7         Matrix(){}
  8         Matrix(int,int);
  9         void setMatrix();
 10         void showMatrix();
 11         void showTransposedMatrix();
 12         friend Matrix operator *(Matrix m1,Matrix m2);
 13     protected:
 14         int m;
 15         int n;
 16         int mn;
 17         double* matrixPtr;
 18         double* transposedMPtr;
 19         void transpose();
 20 };
 21
 22 class SquareMatrix:public Matrix{
 23     public:
 24         SquareMatrix(){}
 25         SquareMatrix(int);
 26         void setSquareMatrix();
 27         void setDet();
 28         void getDet();
 29     private:
 30         double det;
 31 };
 32
 33 Matrix::Matrix(int mt,int nt){
 34     m=mt;
 35     n=nt;
 36     mn=m*n;
 37     matrixPtr=new double[mn];
 38 }
 39
 40 void Matrix::setMatrix(){
 41     cout<<"输入矩阵的行数和列数:"<<endl;
 42     cin>>m>>n;
 43     mn=m*n;
 44     matrixPtr=new double[mn];
 45     for(int i=0;i<mn;i++)
 46         cin>>matrixPtr[i];
 47 }
 48
 49 void Matrix::transpose(){
 50     transposedMPtr=new double[mn];
 51     for(int i=0;i<n;i++)
 52         for(int j=0;j<m;j++)
 53             transposedMPtr[m*i+j]=matrixPtr[n*j+i];
 54 }
 55
 56 void Matrix::showMatrix(){
 57     for(int i=0;i<m;i++){
 58         for(int j=0;j<n;j++)
 59             cout<<matrixPtr[n*i+j]<<‘ ‘;
 60         cout<<endl;
 61     }
 62 }
 63
 64 void Matrix::showTransposedMatrix(){
 65     for(int i=0;i<n;i++){
 66         for(int j=0;j<m;j++)
 67             cout<<transposedMPtr[m*i+j]<<‘ ‘;
 68         cout<<endl;
 69     }
 70 }
 71
 72 Matrix operator *(Matrix m1,Matrix m2){
 73     Matrix m3(m1.m,m2.n);
 74     for(int i=0;i<m3.m;i++)
 75         for(int j=0;j<m3.n;j++){
 76             double val=0;
 77             for(int k=0;k<m2.m;k++)
 78                 val+=m1.matrixPtr[m1.n*i+k]*m2.matrixPtr[m2.n*k+j];
 79             m3.matrixPtr[m3.n*i+j]=val;
 80         }
 81     return m3;
 82 }
 83
 84 SquareMatrix::SquareMatrix(int m){
 85     Matrix(m,m);                      //right?
 86 }
 87
 88 void SquareMatrix::setSquareMatrix(){
 89     cout<<"输入方阵的阶数:"<<endl;
 90     cin>>m;
 91     n=m;
 92     mn=m*n;
 93     matrixPtr=new double[mn];
 94     for(int i=0;i<mn;i++)
 95         cin>>matrixPtr[i];
 96 }
 97
 98 void SquareMatrix::setDet(){
 99     double valDet(double*,int);
100     det=valDet(matrixPtr,m);
101 }
102
103 void SquareMatrix::getDet(){
104     cout<<det<<endl;
105 }
106 double valDet( double *detPtr, int rank)
107 {
108     double val=0;
109     if(rank==1) return detPtr[0];
110     for(int i=0;i<rank;i++)                   //计算余子式保存在nextDetPtr[]中
111     {
112         double *nextDetPtr=new double[(rank-1)*(rank-1)];
113         for(int j=0;j<rank-1;j++)
114             for(int k=0;k<i;k++)
115                 nextDetPtr[j*(rank-1)+k]=detPtr[(j+1)*rank+k];
116         for(int j=0;j<rank-1;j++)
117             for(int k=i;k<rank-1;k++)
118                 nextDetPtr[j*(rank-1)+k]=detPtr[(j+1)*rank+k+1];
119         val+=detPtr[i]*valDet(nextDetPtr,rank-1)*pow(-1.0,i);
120     }
121     return val;
122 }
123
124 int main(){
125     Matrix m1,m2,m3;
126     m1.setMatrix();
127     m2.setMatrix();
128     m3=m1*m2;
129     m3.showMatrix();
130     return 0;
131 }
时间: 2024-12-27 09:13:48

c++实现矩阵乘法的相关文章

矩阵乘法的Strassen算法详解

题目描述 请编程实现矩阵乘法,并考虑当矩阵规模较大时的优化方法. 思路分析 根据wikipedia上的介绍:两个矩阵的乘法仅当第一个矩阵B的列数和另一个矩阵A的行数相等时才能定义.如A是m×n矩阵和B是n×p矩阵,它们的乘积AB是一个m×p矩阵,它的一个元素其中 1 ≤ i ≤ m, 1 ≤ j ≤ p. 值得一提的是,矩阵乘法满足结合律和分配率,但并不满足交换律,如下图所示的这个例子,两个矩阵交换相乘后,结果变了: 下面咱们来具体解决这个矩阵相乘的问题. 解法一.暴力解法 其实,通过前面的分析

51nod 1137 矩阵乘法

基本的矩阵乘法 中间for(int j=0;i<n;i++)  //这里写错了   应该是j<n 晚上果然  效率不行 等会早点儿睡 //矩阵乘法 就是 两个矩阵 第一个矩阵的列 等与 第二个矩阵的行相同 // 然后ans[i][j] += a[i][k] * b[k][j]; #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 150; int n; ll a[ma

矩阵乘法

矩阵加法就是相同位置的数字加一下,矩阵减法也类似 矩阵乘以一个常数,就是所有位置都乘以这个数 矩阵乘以矩阵 计算规则是,第一个矩阵第一行的每个数字(2和1),各自乘以第二个矩阵第一列对应位置的数字(1和1),然后将乘积相加( 2 x 1 + 1 x 1),得到结果矩阵左上角的那个值3 矩阵的本质就是线性方程式,两者是一一对应关系.如果从线性方程式的角度,理解矩阵乘法就毫无难度.下面是一组线性方程式 矩阵的最初目的,只是为线性方程组提供一个简写形式 下面是严格的证明.有三组未知数 x.y 和 t,

矩阵乘法&lt;简单总结&gt;

原理:矩阵相乘最重要的方法是一般矩阵乘积.它只有在第一个矩阵的 行数 和第二个矩阵的 列数 相同时才可进行.若A为m×n矩阵,B为n×p矩阵,则他们的乘积AB会是一个m×p矩阵. 若A=    a    b    c        d    e    f        g    h    i    B=    A    D        B    E        C    F    A*B=CC=    aA+bB+cC    aD+bE+cF        dA+eB+fC    dD+eE

POJ2778 DNA Sequence Trie+矩阵乘法

题意:给定N个有A C G T组成的字符串,求长度为L的仅由A C G T组成的字符串中有多少个是不含给定的N个字符串的题解: 首先我们把所有的模式串(给定的DNA序列)建Trie,假定我们有一个匹配串,并且在匹配过程到S[i]这个字符时匹配到了Trie上的某个节点t,那么有两种可能: 匹配失败:t->child[S[i]]为空,跳转到t->fail,因此t->fail一定不能是某个模式串的结尾: 匹配成功:跳转到t->child[S[i+1]],因此t->child[S[i

【CDQ】BZOJ 2738 矩阵乘法

题意:给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数 思路: 整体二分+二维树状数组 二分询问的答案mid,将数值小等mid的全部插入二维树状数组 然后查询每个矩阵内的元素个数,若数量>K-1则放左边,否则放右边 继续向下分治,左边二分l-mid,右边mid-r 代码: #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include

codevs矩阵乘法系列

T1:矩阵乘法板子题,练手. #include <map> #include <set> #include <cmath> #include <ctime> #include <queue> #include <stack> #include <cstdio> #include <string> #include <vector> #include <cstdlib> #include

基于OpenMP的矩阵乘法实现及效率提升分析

一.  矩阵乘法串行实现 例子选择两个1024*1024的矩阵相乘,根据矩阵乘法运算得到运算结果.其中,两个矩阵中的数为double类型,初值由随机数函数产生.代码如下: #include <iostream> #include <omp.h> // OpenMP编程需要包含的头文件 #include <time.h> #include <stdlib.h> using namespace std; #define MatrixOrder 1024 #def

C语言 &#183; 矩阵乘法 &#183; 算法训练

问题描述 给定一个N阶矩阵A,输出A的M次幂(M是非负整数) 例如: A = 1 2 3 4 A的2次幂 7 10 15 22 输入格式 第一行是一个正整数N.M(1<=N<=30, 0<=M<=5),表示矩阵A的阶数和要求的幂数 接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值 输出格式 输出共N行,每行N个整数,表示A的M次幂所对应的矩阵.相邻的数之间用一个空格隔开 样例输入 2 21 23 4 样例输出 7 1015 22 代码如下: #include<s

*HDU2254 矩阵乘法

奥运 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 2990    Accepted Submission(s): 761 Problem Description 北京迎来了第一个奥运会,我们的欢呼声响彻中国大地,所以今年的奥运金牌 day day up!比尔盖兹坐上鸟巢里,手里摇着小纸扇,看的不亦乐乎,被俺们健儿的顽强拼搏的精神深深的