矩阵相乘求解最小数乘次数

article/2025/7/21 8:51:36

矩阵连乘问题:

给定n 个矩阵(A0,A1,....An-1) 其中 Ai 和 Ai+1 是可乘的, i=0, 1,... , n-2 .

求解计算这n 个矩阵的连乘积A0A1....An-1 。

由于矩阵连乘满足结合律,因此矩阵的乘法可以有多种不同的计算次序,每种计算次序对应不同的数乘次数。可以利用加括号的方式确定计算次序。如果矩阵连乘完全加了括号,则说明计算次序确定。

例如 三个矩阵{A0,A1,A2} 连乘,其中矩阵的维数 分别为 10*100    100*5    和 5*50

其中有两种计算次序:    

 /// 数乘次数 = 左矩阵行数 * 右矩阵列数 * 左矩阵列数

第一种:(A0*A1)*A2   ; 该种加括号的方式: 数乘次数 = 10 *5 *100 +10*50*5 =7500

第二种: A0*(A1*A2)  , 该种加括号的方式: 数乘次数  =  100*50*5 +10*50*100 =75000

 

思想: 计算Ai*....Aj  的次数 =  Ai*...*Ak 的次数+ Ak+1 * ...*Aj 的次数 +  左右矩阵相乘的数。

/// Pk 代表从k 处划分右矩阵的行数,  pj 代表 右矩阵相乘后的列数,    pi 代表 右矩阵的列数 

对于一组矩阵:A1(30x35),A2(35x15),A3(15x5),A4(5x10),A5(10x20),A6(20x25)    个数N为6

那么p数组保存它们的行数和列数:p={30,35,15,5,10,20,25}共有N+1即7个元素///最后第7个元素即为最后一个矩阵的列数

p[0],p[1]代表第一个矩阵的行数和列数,p[1],p[2]代表第二个矩阵的行数和列数......p[5],p[6]代表第六个矩阵的行数和列数

具体思想: 初始化,每个矩阵链长度为1 的数乘次数为0   即(m[i][i]==0)

当计算链长大于1 时, 利用前面已经算出结果, 求解问题:

 m[i][j] = m[i+1][j]+ p[i+1]*p[i]*p[j+1]; ///利用之前划分的结果

最后在对 i ~  j  的矩阵 划分, 看是否有比原结果更小的划分。

  for(int r=i+1;r<j;r++){     /// 进一步求子列的最优解
          int  t=m[i][r] + m[r+1][j] + p[i]*p[r+1]*p[j+1];
            if(t<m[i][j]){
                s[i][j]=r;///记录划分点
                m[i][j]=t;
            }

完整代码:

#include<iostream>
#include<cstdio>
using namespace std;
const int N =7;
void MartrixChain(int p[],int n,int s[][N],int m[][N])
{int i,j,k;for(i=0;i<n;i++)///i 到 i 表示的是 A0 ~ An-1 的单个矩阵,独立的矩阵,所以计算次数为0m[i][i]=0;for(k=2;k<=n;k++)///代表相乘矩阵的个数为 Kfor(i=0;i<n-k+1;i++){j=i+k-1;///i 为子列的起点, j 为末端m[i][j] = m[i+1][j]+ p[i+1]*p[i]*p[j+1]; ///利用之前划分的结果s[i][j]=i;//记录划分点for(int r=i+1;r<j;r++){     /// 进一步求子列的最优解int  t=m[i][r] + m[r+1][j] + p[i]*p[r+1]*p[j+1];if(t<m[i][j]){s[i][j]=r;///记录划分点m[i][j]=t;}}}
}
void TraceBack(int s[][N],int i,int j)
{if(i==j) return ;cout<<"(";TraceBack(s,i,s[i][j]);TraceBack(s,s[i][j]+1,j);cout<<")";}
int main()
{int R[]={30,35,15,5,10,20,25};int m[N][N];int s[N][N];MartrixChain(R,6,s,m);TraceBack(s,0,5);return 0;
}

 


http://chatgpt.dhexx.cn/article/PFag9HUr.shtml

相关文章

人工智能数学基础-线性代数1:向量及向量加减法与数乘

☞ ░ 老猿Python博文目录░ 一、向量 1.1、向量定义 向量也称为欧几里得向量、几何向量、矢量&#xff0c;指具有大小&#xff08;magnitude&#xff09;和方向的量。它可以形象化地表示为带箭头的线段。箭头所指&#xff1a;代表向量的方向&#xff1b;线段长度&#xff1…

线性代数-向量数乘、点乘意义

Vector 什么是向量基向量向量数乘向量的加法向量点乘 什么是向量 向量是指具有大小和方向的量。它可以形象化地表示为带箭头的线段 箭头所指&#xff1a;代表向量的方向 线段长度&#xff1a;代表向量的大小 向量是线性代数中最基础、最根源的组成部分&#xff0c;向量加法和…

C语言——矩阵计算(转置、加法、减法、数乘、乘法)

使用该计算器可以帮助你快速完成矩阵的简单计算。 #include <stdio.h> void menu() {printf("****************************************************************\n");printf("****************************************************************\n"…

各种乘法的区别 “点积、外积、数乘...等

Ive seen several conventions, including ⋅⋅, ∘∘, ∗∗, ⊗⊗, and ⊙⊙. However, most of these have overloaded meanings (see http://en.wikipedia.org/wiki/List_of_mathematical_symbols). Thus, in my personal experience, the best choice Ive found is: ⊙(\o…

06 ,矩阵的运算:加法运算,数乘,矩阵乘向量,矩阵相乘

1 &#xff0c;矩阵计算 &#xff1a; 加法运算 前提 &#xff1a; 必须同型矩阵之间才可以进行加法运算运算 &#xff1a; 两个 m * n 矩阵相加总结 &#xff1a; 对应元相加 2 &#xff0c;矩阵计算 &#xff1a; 数乘 计算规则 &#xff1a; 3 &#xff0c;矩阵计算 &…

7.进入线性代数的奇妙世界:向量的乘法之数乘

向量的乘法有3种&#xff0c;一是数乘&#xff0c;二是点积&#xff0c;三是叉积。听起来名称有点陌生&#xff0c;别急&#xff0c;接下来一一道来&#xff0c;先讲数乘。 数乘&#xff0c;就是用数字乘以一个向量&#xff0c;或用向量乘以一个数字&#xff0c;两者之间结果相…

【图像特征提取】基于脉冲耦合神经网络(PCNN)实现图像特征提取含Matlab源码

1 简介 脉冲耦合神经网络&#xff08;PCNN——Pulse Coupled Neural Network&#xff09;,由于其非常接近人类大脑的生物神经网络的特性&#xff0c;现已广泛应用在图像处理中&#xff0c;是一种重要的信息处理工具&#xff0c;具有优良的自适应图像分割和自适应特征提取能力。…

CRCNN PCNN

目录 论文阅读前期准备前期知识储备学习目标 论文导读论文研究背景、成果及意义论文泛读论文结构摘要 论文精读CRCNN模型PCNN模型论文总结 论文阅读前期准备 前期知识储备 学习目标 论文导读 论文研究背景、成果及意义 回顾 Bootstrapping 远程监督 多示例学习 分类损失…

传统PCNN算法python实现

传统耦合神经网络&#xff08;pcnn&#xff09;算法的实现&#xff08;python&#xff09;&#xff1a; 参数的设定没有具体参考&#xff0c;这是一篇文献中的解释&#xff1a; # coding:utf-8 # from PIL import Image from pylab import * from scipy import signal as sg…

关系抽取远程监督PCNN:Distant Supervision for Relation Extraction via Piecewise Convolutional Neural Networks

Distant Supervision for Relation Extraction via Piecewise Convolutional Neural Networks 0 前言1 多示例学习2 数据集3 模型架构3.1 向量表示3.2 卷积、分段最大池化与分类3.3 样本选择与损失 5 结语6 参考资料 0 前言 远程监督&#xff08;distant supervision&#xff…

脉冲耦合神经网络(PCNN)的python实现

前言 看了很多人用matlab写的网络,竟然没有python代码。作为正在研究PCNN模型的一名学生,必须安排。 数学模型 打公式太麻烦,直接从截图啦,全连接模型,如下图1。 python代码 """ Created on Sun Jun 6 16:48:38 2021PCNN全连接 """ impor…

pytorch关系抽取框架OpenNRE源码解读与实践:PCNN ATT

pytorch关系抽取框架OpenNRE源码解读与实践&#xff1a;PCNN ATT 0 前言1 OpenNRE整体架构2 PCNNATT 模型架构2.1 PCNN Encoder2.2 Bag Attention 结语参考资料 0 前言 OpenNRE是清华大学推出的开源关系抽取框架&#xff0c;针对命名实体识别&#xff0c;句子级别的关系抽取&a…

【MATLAB图像融合】[14]PCNN脉冲耦合神经网络代码分享

本代码转自厦门大学屈小波教授15年的DEMO代码。 % Demo for PCNN in image processing % --------- % Author: Qu Xiao-Bo <qxb_xmu [at] yahoo.com.cn> Aug.28,2008 % Postal address: % Rom 509, Scientific Research Building # 2,Haiyun Campus, Xi…

PCNN探究实验

1.常规PCNN&#xff0c;采用kin的连接权矩阵&#xff0c;并固定参数beta 0.2 alph 0.22 Ve 50 周期为15 初次迭代&#xff0c;图像信息熵最大&#xff0c;但效果不是最好的&#xff0c;在周期临界位置的不同迭代次数有不同的分割效果&#xff0c;第11次迭代效果最好。 因此…

脉冲耦合神经网络(PCNN)的matlab实现

基本脉冲耦合神经网络的matlab实现 Gray 首先发现了猫的初生视觉皮层有神经激发相关振荡现象&#xff0c;并将其研究结果发在了 Nature 杂志上。与此同时&#xff0c; Eckhom 也根据猫的大猫皮层的同步脉冲发放现象&#xff0c;提出了脉冲发现的连接模式&#xff0c;将开拓性地…

【MATLAB图像融合】[18]双通道PCNN模型实现图像融合

引言 简单回顾一下以往的单通道PCNN模型&#xff0c;原理与实现步骤&#xff1a; 13、单通道PCNN原理 14、单通道PCNN融合代码实现 一、单通道PCNN 图1 单通道PCNN&#xff1a; 在单通道PCNN中&#xff0c;对于一个神经元的一次迭代过程正如图1描述&#xff1a; ①、F&#…

PCNN

Distant Supervision for Relation Extraction via Piecewise Convolutional Neural Networks 1. 关键字 关系抽取&#xff0c;远程监督 2. 摘要 本文提出了PCNNs&#xff0c;用来解决远程监督关系抽取中的两个问题&#xff1a;一个是在对齐知识图谱时的错误标注问题&#xff0…

【NLP】基于神经网络PCNN(Piece-Wise-CNN)的关系抽取模型

背景 关系抽取是信息抽取的基本任务之一&#xff0c;对于知识库的构建以及文本的理解十分重要&#xff0c;在自然语言处理的一些任务&#xff0c;如问答&#xff0c;文本理解等得到了广泛的应用。 这里介绍的关系抽取主要指的是实体之间的关系抽取&#xff0c;实体是之前NER任…

PCNN 脉冲耦合神经网络整理

PCNN 脉冲耦合神经网络 脉冲耦合神经元模型 神经元的输入有哪些&#xff1f; 首先来看看这个神经元的图示的左边&#xff0c;有 Y Y Y和 F F F。 Y Y Y为这个神经元之前输出的数值&#xff0c;就是说这个模型需要进行多次的运算&#xff0c;每次的运算需要上一次运算的值来做…

关系抽取之分段卷积神经网络(PCNN)

文章目录 远程监督PCNN关系抽取PCNN方法论向量表达卷积层分段最大池化层Softmax层多实例学习 Reference Tensorflow2.2实现&#xff0c;见github仓库。 远程监督 关系抽取训练集标注成本高&#xff0c;一般使用远程监督方法&#xff08;半监督&#xff09;自动标注数据。远程监…