当前位置:首页 » 编程语言 » 矩阵连乘c语言
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

矩阵连乘c语言

发布时间: 2022-01-19 19:03:44

❶ 求一个用c语言写的,矩阵乘法的三重循环程序。谢谢啦

#include "iostream.h"

void MatrixChain(int *p,int n,int **m,int **s)
{
for(int i=1;i<=n;i++)
m[i][i]=0;
for(int r=2;r<=n;r++)
for( 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 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<<"让 A"<<i;//<<","<<s[i][j];
cout<<"和 A"<<(s[i][j]+1)<<"相乘"<<endl;//<<","<<j<<"相乘"<<endl;

}

void main()
{

int n,*p;
int j=1;
cout<<"请输入矩阵的个数"<<endl;
cin>>n;
p=new int[n+1];

cout<<"请输入第一个矩阵的行数,然后按回车键"<<endl;
cin>>p[0];
cout<<"第"<<j<<"个矩阵是"<<endl;
cout<<p[0]<<"*";
cin>>p[1];
// cout<<p[1]<<endl;
cout<<endl;
for(int i=2;i<n+1;i++)
{

cout<<"第"<<i<<"个矩阵是:";
cout<<p[i-1]<<"*";
cin>>p[i];
}
// int p[]={30,35,15,5,10,20,25};
// int m[6][6],s[6][6];

int **m,**s;
m=new int*[n];
for( i=1;i<=n;i++)
m[i]=new int[n];

s=new int*[n];
for( i=1;i<=n;i++)
s[i]=new int[n];

MatrixChain(p,n,m,s);
Traceback(1,n,s);

}
这是矩阵连乘

❷ 列出矩阵连乘所有完全加括号方式(C语言)

给个思路 递归 把abcd拆成左右两部分 有三种拆法 其实是n-1种 然后for 每一种 递归下去

❸ 谁知道用C程序写个 矩阵连乘的算法,

这里我们用两种方式做一比较:
假设原来相乘的3个矩阵为如下方式(为了区别,特选择大写和小写两种表示方式):
A*B B*C C*D
前两个先乘:
A*B B*C
a*b*c次乘法
a*(b-1)*c次加法
结果为A*C,然后再与C*D相乘:
A*C C*D
a*c*d次乘法
a*(c-1)*d次加法
共a*b*c+a*c*d=a*c*(b+d)次乘法
共a*(b-1)*c+a*(c-1)*d=a*c*(b+d)-a*(c+d)次加法
实际上:乘法的执行时间远远大于加法的执行时间,故略去加法时间不计。

如果换一种方式:
A*B B*C C*D
先后两者相乘:
B*C C*D = B*D
乘法:b*c*d
再与前者相乘:
A*B B*D
乘法:a*b*d
共(a+c)*b*d次乘法
这里只需要比较
a*c*(b+d)和(a+c)*b*d谁大谁小的问题
当 a*c*(b+d)>(a+c)*b*d 时说明前者更浪费机时,反之便是后者更浪费机时。
因此3个矩阵相乘时的选择策略函数就是比较他们的阶数关系。

对于A1=35*40 A2=40*20 A3=20*10
因为
a = 35, b = 40, c = 20, d = 10
a*c*(b+d) = 35*20*(40+10) = 35000
(a+c)*b*d = (35+20)*40*10 = 22000
前者大于后者,说明选择先将前两个相乘不如选择先将后两个相乘节省机时。

❹ 自己用C语言写了一个动态规划求矩阵连乘。但是在定义数组有问题。请高手指点。。

m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];这句话调用到m[n][n],但是实际上只能调用到m[n-1][n-1]。(因为从0开始的嘛。不过有时候也能用,就是用了下一维的第0个)
所以要写int m[7][7](要不就8,8)。
至于int m[n][n]为什么会对,我猜是直接用了内存的其他部分吧。。

❺ 矩阵连乘问题C语言

对于矩阵的连乘,只能按照矩阵的定义来求取相应的元素,opencv里倒是应用了矩阵的概念,但是c++的设计理念。不知道能不能解决你的问题。

❻ 动态规划 矩阵连乘 c语言

#include <stdio.h>
#include <limits.h>
#include<stdlib.h>
#define LENGTH 6

void MatrixChainOrder(int p[],int m[][LENGTH],int s[][LENGTH])
{
int n=LENGTH;
int i,j,k,r,t;
for(i=0;i<n;i++)
m[i][i]=0;
for( r=1;r<n;r++)
{
for(i=0;i<n-r;i++)
{

j=i+r;
m[i][j]=m[i][i]+m[i+1][j]+p[i]*p[i+1]*p[j+1];
s[i][j]=i;
for(k=i+1;k<j;k++)
{
t=m[i][k]+m[k+1][j]+p[i]*p[k+1]*p[j+1];
printf("t=%d;,m[%d][%d]=%d\n",t,i,j,m[i][j]);
if(t<m[i][j])
{
m[i][j]=t;
s[i][j]=k;
}
}

}

}
}
int main()
{
int p[] = {30,35,15,5,10,20,25};
int m[LENGTH][LENGTH];
int s[LENGTH][LENGTH];
int i,j,k;
MatrixChainOrder(p,m,s);
printf("最少数乘次数:\n");
for(i = 0;i<LENGTH;i++)
{ for(j = 0 ;j<=i ;j++ )
printf(" ");
for(k = i; k<LENGTH;k++)
printf("%8d",m[i][k]);
printf("\n");
}
printf("断开位置:\n");
for(i = 0;i<LENGTH;i++)
{ for(j = 0 ;j<=i ;j++ )
printf(" ");
for(k = i; k<LENGTH;k++)
printf("%4d",s[i][k]);
printf("\n");
}

system("Pause");
return 0;
}

❼ 求一个三个矩阵连乘的C++代码,要求分别输入这三个矩阵后,计算输出结果!求大神帮忙

#include<stdio.h>
#include <stdafx.h>

void Matrix_ABC(double *a,double *b, double *c,double *result,int m, int n, int p, int q);

void main()
{
int m=3,n=2,p=2,q=4;
double a[]={1,0,1,0,1,0};
double b[]={2,3,2,3};
double c[]={3,1,3,1,0,0,0,0};

double *result;

result=new double[m*q];

int i,j;

printf("A\n");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
printf("%f\t",a[i*n+j]);
printf("\n");
}

printf("B\n");

for(i=0;i<n;i++)
{
for(j=0;j<p;j++)
printf("%f\t",b[i*p+j]);
printf("\n");
}
printf("C\n");

for(i=0;i<p;i++)
{
for(j=0;j<q;j++)
printf("%f\t",c[i*q+j]);
printf("\n");
}
printf("\n");
Matrix_ABC(a,b,c,result,m,n,p,q);
printf("A*B*C\n");

for(i=0;i<m;i++)
{
for(j=0;j<q;j++)
printf("%f\t",result[i*q+j]);
printf("\n");
}

delete [] result;

}

void Matrix_ABC(double *a,double *b, double *c,double *result,int m, int n, int p, int q)
{
int i,j,k;

double *temp;

temp=new double[m*p];

for(i=0;i<m;i++)
for(j=0;j<p;j++)
{
temp[i*p+j]=0;
for(k=0;k<n;k++)
temp[i*p+j]+=a[i*n+k]*b[n*k+j];

}

for(i=0;i<m;i++)
for(j=0;j<q;j++)
{
result[i*q+j]=0;
for(k=0;k<p;k++)
result[i*q+j]+=temp[i*p+k]*c[q*k+j];

}

delete [] temp;
}