當前位置:首頁 » 編程語言 » 矩陣連乘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;
}