矩阵连乘问题
给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。如数据文件input.txt为:
6(矩阵个数)
30
35
15
5
10
20
25文章来源地址https://www.toymoban.com/news/detail-735095.html
#include <stdio.h>
#include <stdlib.h>
//用来得到最优解的m[][],s[][];m存储矩阵相乘的最小运算量,主对角线上的值为0,依次求2个矩阵3个矩阵•、直到n个矩阵相乘的最小运算量,其中每次矩阵相乘的最小运算量都在
//上一次矩阵相乘的最小运算量的基础上求得,最后一次求得的值即为口个矩阵相乘的最小运算量
//s存储最优断开位置(加括号位置)
FILE *fp;
void MatrixChain(int p[6] ,int n, int m[][7],int s[][7]) {
int r = 0;//当前参与矩阵连乘的元素的个数
int i = 0;//记录起始下标
int j = 0;//记录终止下标
int k = 0;//表示当前还有的加括号
int t = 0;//交换
for (i = 1; i <= n; i++)
m[i][i] = 0;//当只有一个矩阵时,乘法次数是0
for (r = 2; r <= n;r++) //至少是两个矩阵参与连乘,最多有n个
for (i = 1; i <= n - r + 1; i++) {//i<n-r+1,表示当R=3时,第一下标最多是4,才能组成(A4 A5 A6)保证其是三个.
j = i + r - 1;//当起始下标和个数确定之后,终止下标是固定的
m[i][j] = m[i][i] + m[i + 1][j] + p[i - 1] * p[i] * p[j];//都默认从起始下标之后加第一个括号,即当作从第一个断开得到初始值
s[i][j] = i;
for (k = i + 1; k < j; k++) {//从第二层循环开始,也就是当r>2时,还会有j-i种加括号的方法
t = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
if (t < m[i][j]) {//如果这j-中方法里还有比第一种方法小的,就交换.
m[i][j] = t;
s[i][j] = k;
}
}
}
}
void TrackBack(int i,int j, int s[][7])
{
if(i == j) {
printf("A%d ", i);
fprintf(fp,"A%d ", i);
}
else
{
printf("(");
fprintf(fp,"(");
TrackBack(i,s[i][j],s);
TrackBack(s[i][j]+1,j,s);
fprintf(fp,")");
printf(")");
}
}
int main() {
FILE*fp1=NULL;
int buff1[255];
int i=0,n;
fp1=fopen("juzhenliancheng_input","r");
while(fscanf(fp1,"%d", &buff1[i])!=EOF)
{
i++;
}
for(int j=0;j<i;j++)
{
printf("%d ", buff1[j]);
}
printf("\n");
n = buff1[0];
int *p;
p= (int *)malloc(n * sizeof(char));
// int p[] ={};//p用来存放每一个矩阵的行数
for(int k=1,i=0;i<=n;k++,i++)
p[i]=buff1[k];
int s[7][7] = {0};
int m[7][7] = {0};
if( (fp=fopen("juzhenliancheng_out.txt","w+")) == NULL ){
puts("Fail to open file!");
}
MatrixChain(p, n, m, s);
TrackBack(1, n, s);
printf("矩阵最小相乘次数为:%d\n",m[1][n]);
printf("\n矩阵相乘的最小次数矩阵为:\n");
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
printf("%d \t",m[i][j]);
}
printf("\n");
}
printf("\n矩阵相乘断开的位置矩阵为:\n");
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
printf("%d ",s[i][j]);
}
printf("\n");
}
}
文章来源:https://www.toymoban.com/news/detail-735095.html
到了这里,关于矩阵连乘问题C语言实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!