矩阵连乘问题C语言实现

这篇具有很好参考价值的文章主要介绍了矩阵连乘问题C语言实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

矩阵连乘问题

给定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");
    }
}

到了这里,关于矩阵连乘问题C语言实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 动态规划之矩阵连乘问题C++版

    算法总体思想          动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题         但是经分解得到的子问题往往不是互相独立的。不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多次。        

    2024年01月16日
    浏览(33)
  • 动态规划:矩阵连乘问题,字节跳动今日学习内容

    分析: 二.问题分析 由于矩阵乘法满足结合律,所以计算矩阵连乘的连乘积可以与许多不同的计算计算次序,这种计算次序可以用加括号的方式来确定。若一个矩阵连乘积的计算次序完全确定,也就是说连乘积已完全加括号,那么可以依此次序反复调用2个矩阵相乘的标准算法

    2024年04月11日
    浏览(41)
  • 动态规划:矩阵连乘问题(文末附有手写版例题)

    A是一个p × q矩阵,B是一个q × r矩阵,AB相乘,得到的矩阵元素个数为p × r,每个元素由q次乘法得到,因此所需乘法次数为p × q × r。 在计算矩阵连乘积时,加括号的方式对计算量有影响。 例如有三个矩阵A1,A2,Ag连乘,它们的维数分别为 10x100,100×5,5×50。用第一种加括号方

    2024年02月04日
    浏览(33)
  • 动态规划2:算法考试矩阵连乘问题(超详细手写过程)

                                      更多期末复习笔记欢迎访问我的博客: Miuuu · 语雀​​​​​​​ 动态规划理论基础:(6条消息) 动态规划1:动态规划的入门初学理论基础_黑色柳丁Angel的博客-CSDN博客 矩阵连乘问题是我在算法课接触的第一个动态规划问题

    2023年04月08日
    浏览(31)
  • PTA(C语言)本题要求编写程序,求一个给定的m×n矩阵各行元素之和。

    本题要求编写程序,求一个给定的m×n矩阵各行元素之和。 输入格式: 输入第一行给出两个正整数m和n(1≤m,n≤6)。随后m行,每行给出n个整数,其间 以空格分隔。 输出格式: 每行输出对应矩阵行元素之和。 输入样例: 输出样例:  

    2024年02月03日
    浏览(33)
  • 数据结构学习记录——图应用实例-拯救007(问题描述、解题思路、伪代码解读、C语言算法实现)

    目录 问题描述  解题思路 伪代码  总体算法 DFS算法 伪代码解读 总体算法 DFS算法 具体实现(C语言) 在老电影“007之生死关头”(Live and Let Die)中有一个情节,007被毒贩抓到一个鳄鱼池中心的小岛上,他用了一种极为大胆的方法逃脱 —— 直接踩着池子里一系列鳄鱼的大脑

    2024年02月05日
    浏览(56)
  • 【算法设计与分析】拉丁矩阵问题——对于给定的m和n,计算出不同的宝石排列方案数。

    问题描述   现有n种不同形状的宝石,每种宝石有足够多颗。欲将这些宝石排列成m行n列的一个矩阵,m≤n,使矩阵中每行和每列的宝石都没有相同的形状。试设计一个算法,计算出对于给定的m和n,有多少种不同的宝石排列方案。 数据输入   由文件input.txt给出输入数据。

    2024年02月04日
    浏览(31)
  • 『动态规划』矩阵连乘

    活动地址:CSDN21天学习挑战赛 👨‍🎓作者简介:一位喜欢写作,计科专业大三菜鸟 🏡个人主页:starry陆离 🕒首发日期:2022年8月16日星期二 🌌上期文章:『动态规划』动态规划概述 📚订阅专栏:『算法分析与设计』 如果文章有帮到你的话记得点赞👍+收藏💗支持一下哦

    2024年02月07日
    浏览(55)
  • 数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。

    最短路径的算法有两个, Dijkstra算法 和 Floyd算法 。 Dijkstra算法 解决的是 单源 最短路径问题 。 Floyd算法解决的是 多源 最短路径问题,并且可以处理负权图 。 今天要讲的就是Dijkstra算法。 加: feng--Insist (大写的i),进java交流群讨论互联网+技术。可索要PPT等资料。 其他资料

    2024年02月11日
    浏览(33)
  • EXCEL, 用if({1,0,0} ...) 实现把给定的区域,输出为任意你想要的矩阵,数组区域!

    目录 1 原材料:这样的一个区域 + 工具 if({1,0,0}) 数组公式 1.1 原始数据  1.2 原理 if(0/1,t-value,f-value)---变形---if({},range1,range2) 1.2.1 if(0/1,t-value,f-value)---变形---if({},range1,range2) 1.2.2 原理1: if 数组原理,虽然if()只能判断1次输出1个结果,但是 if({}) 是if()+数组就可以进行多次判断,

    2024年02月13日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包