矩阵连乘算法

//A1 30*35 A2 35*15 A3 15*5 A4 5*10 A5 10*20 A6 20*25
//p[0-6]={30,35,15,5,10,20,25}
#include <stdio.h>
#include <iostream>
using namespace std;

const int L = 7;

int MatrixChain(int n,int **m,int **s,int *p);
void Traceback(int i,int j,int **s);//构造最优解

int main()
{
int p[L]={30,35,15,5,10,20,25};

int **s = new int *[L];
int **m = new int *[L];
for(int i=0;i<L;i++)
{
s[i] = new int[L];
m[i] = new int[L];
}

cout<<"矩阵的最少计算次数为:"<<MatrixChain(6,m,s,p)<<endl;
cout<<"矩阵最优计算次序为:"<<endl;
Traceback(1,6,s);
return 0;
}

int MatrixChain(int n,int **m,int **s,int *p)
{
for(int i=1; i<=n; i++)
{
m[i][i] = 0;
}
for(int r=2; r<=n; r++) //r为当前计算的链长(子问题规模)
{
for(int i=1; i<=n-r+1; i++)//n-r+1为最后一个r链的前边界
{
int j = i+r-1;//计算前边界为r,链长为r的链的后边界

m[i][j] = m[i+1][j] + p[i-1]*p[i]*p[j];//将链ij划分为A(i) * ( A[i+1:j] )

s[i][j] = i;

for(int k=i+1; k<j; k++)
{
//将链ij划分为( A[i:k] )* (A[k+1:j])
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;
}
}
}
}
return m[1][L-1];
}

void Traceback(int i,int j,int **s)
{
if(i==j) return;
Traceback(i,s[i][j],s);
Traceback(s[i][j]+1,j,s);
cout<<"Multiply A"<<i<<","<<s[i][j];
cout<<" and A"<<(s[i][j]+1)<<","<<j<<endl;
}

时间: 2024-10-06 17:00:04

矩阵连乘算法的相关文章

用Spark学习矩阵分解推荐算法

在矩阵分解在协同过滤推荐算法中的应用中,我们对矩阵分解在推荐算法中的应用原理做了总结,这里我们就从实践的角度来用Spark学习矩阵分解推荐算法. 1. Spark推荐算法概述 在Spark MLlib中,推荐算法这块只实现了基于矩阵分解的协同过滤推荐算法.而基于的算法是FunkSVD算法,即将m个用户和n个物品对应的评分矩阵M分解为两个低维的矩阵:$$M_{m \times n}=P_{m \times k}^TQ_{k \times n}$$ 其中k为分解成低维的维数,一般远比m和n小.如果大

矩阵相乘的算法

很久没写blog了,感觉人都快变的抑郁了,换工作之后各种揪心,说好了是做Android的,结果让我搞各种算法,也罢,权当学习了一点知识吧. 今天说说矩阵相乘的算法,计算算法很简单,就是3个for循环. 首先还是说下矩阵相乘的概念,其实大学的时候线性代数中应该有讲到,不过到现在估计都还给老师了. 废话不多说,矩阵,其实就是一个二维数组,横竖排列的,比如int[5][6],就是一个矩阵,表示有5行6列. 只有当矩阵A的列数与矩阵B的行数相等时A×B才有意义.一个m×n的矩阵a(m,n)左乘一个n×p

poj 3690 字符矩阵匹配----HASH算法

http://poj.org/problem?id=3690 UVA还有一道也是这样的题,LRJ给的算法是AC自动机----我还没写过,今天用HASH搞了这道题 思路很清晰,但是处理起来还因为HASH函数写混WA了几次... 文本矩阵n*m    T个匹配矩阵p*q 思路: 1.把每一行处理出长为q的hash值 2.对于1中得到的p个哈希值在算一次哈希,这样就把一个矩阵用一个hash值替代了 3.把所有的匹配矩阵压入multiset,然后对于文本矩阵的每一个p*q的子矩阵,算出矩阵哈希值,从mu

图论之最短路01——最短路矩阵(FLOYD)算法

%======================================================== %最短路矩阵算法,FLOYD算法 %针对性:方案预算,能求出所有点之间的最短路(最小费用等) %======================================================== function D=zuiduanjulijuzhen(quanzhijuzhen) n=length(quanzhijuzhen); D=quanzhijuzhen; m

矩阵相乘优化算法实现讲解

矩阵相乘      什么是矩阵? 在数学中,矩阵(Matrix)是指纵横排列的二维数据表格,最早来自于方程组的系数及常数所构成的方阵.这一概念由19世纪英国数学家凯利首先提出. 矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中.并且在ACM竞赛,有很多涉及到矩阵知识的题.许多算法都会结合矩阵来处理,而比较具有代表性的矩阵算法有:矩阵快速幂.高斯消元等等. 例如下面的图片就是一个矩阵: 上述矩阵是一个 4 × 3 矩阵: 某矩阵 A 的第 i 行第 j 列,或 I , j位,通常记为

算法导论-矩阵乘法-strassen算法

目录 1.矩阵相乘的朴素算法 2.矩阵相乘的strassen算法 3.完整测试代码c++ 4.性能分析 5.参考资料 内容 1.矩阵相乘的朴素算法 T(n) = Θ(n3) 朴素矩阵相乘算法,思想明了,编程实现简单.时间复杂度是Θ(n^3).伪码如下 1 for i ← 1 to n 2 do for j ← 1 to n 3 do c[i][j] ← 0 4 for k ← 1 to n 5 do c[i][j] ← c[i][j] + a[i][k]⋅ b[k][j] 2.矩阵相乘的stra

顺时针打印矩阵(经典算法)

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. #该函数像魔方一样翻转矩阵,每次都把要打印的一列翻转到第一行def turnMatrix(matrix): r = len(matrix) c = len(matrix[0]) B = [] for i in range(c-1,-1,-

矩阵分解推荐算法(LMF)

首先我们现在有一个矩阵\(R_{mn}\),其中\(R_{ij}\)代表第\(i\)个用户对第\(j\)个商品的喜爱程度. \(LMF\)算法认为每个商品上面都有一些隐因子,而顾客的喜爱程度是由这些隐因子来决定的.因此便可以将\(R_{mn}\)分解成\(P_{mF} \times Q_{Fn}\)的形式. 矩阵\(P_{mF}\)代表了这\(m\)个用户对\(F\)个隐因子的喜爱程度,\(Q_{Fn}\)代表这\(F\)个隐因子在这\(n\)个商品上的分布概率. \[R'_{ij}=\sum_

矩阵键盘扫描算法

函数的主体 unsigned char GetKey() { unsigned char i,j,k; static unsigned char backup[4][4]={ {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1} }; EA=1; TMOD=0x01;//设置T0为模式1 TH0=0xF8; TL0=0xCD; ET0=1;//使能T0中断 TR0=1;//启动T0 while(1) { for(i=0;i<4;i++)//循环检测4×4的矩阵按键 {