矩阵连乘

    xiaoxiao2023-03-24  12

    矩阵乘法有两个需要注意的地方,第一个就是A*B时,A的列数要个B的行数相同,另外一个需要注意的地方就是矩阵乘法不满足交换律。

    在矩阵中有维度,而矩阵连乘就是维度相乘,例如:A的矩阵维度是5*10,B的矩阵是10*10,那么相乘的次数就是5*10*10,在多矩阵乘法当中可以使用()来改变乘法的次数,这种方法可以使用穷举法,可是在少矩阵中还是可以的,如果特别多的情况之下,就会特别的耗费时间,那么可以采用动态规划方法来解决。下面来简要介绍一下动态规划的要素,以及步骤。基本要素:1,最优子结构性质2,重叠子问题性质。步骤:1,找出最优解的性质,并刻画结构特征2,递归定义最优解3,以自底而上的方式计算最优解4,根据最优解时得到的信息构造最优解。

    下面对矩阵连乘进行分析,因为要对其加括号来改变优先级,所以在子问题当中也应该是最优解的形式,所以计算次序的最优解 应该包含着子问题的最优解。下面就来建立递归关系m[i][j]=0(i==j )   m[i][j]=min{m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j]}(i<j)   计算最优解,在计算之中需要计算重复的计算,就会增加时间复杂度,所以可以使用一个函数来记录计算结果

    #include <iostream> #include <stdio.h> using namespace std; void matrixChain(int *p,int m[][100],int s[][100],int n) {     for(int i=0;i<=n;i++)     m[i][i]=0;     for(int r=2;r<=n;r++)//矩阵相乘的个数         for(int i=1;i<=n-r+1;i++)//矩阵开始位置         {             int j=i+r-1;//矩阵结束位置         m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];     s[i][j]=i;//断点位置     for(int k=i+1;k<j;k++)//截断位置         {int t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];     if(t<m[i][j]){m[i][j]=t;s[i][j]=k;}         }         } } void trackback(int i,int j,int s[][100]) {     if(i==j) return ;     trackback(i,s[i][j],s);     trackback(s[i][j]+1,j,s);     cout<<"Mutiply A"<<i<<","<<s[i][j];     cout<<"and A"<<(s[i][j]+1)<<","<<j<<endl; } int main() {     int p[100],m[100][100],s[100][100];     int n;     cin>>n;     for(int i=1;i<=n;i++)         cin>>p[i];     matrixChain(p,m,s,n);     trackback(1,n,s);     return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-1201719.html
    最新回复(0)