當前位置:首頁 » 操作系統 » 矩陣連乘演算法

矩陣連乘演算法

發布時間: 2022-01-08 14:50:47

❶ 矩陣連乘問題C語言

對於矩陣的連乘,只能按照矩陣的定義來求取相應的元素,opencv里倒是應用了矩陣的概念,但是c++的設計理念。不知道能不能解決你的問題。

❷ Mathematica 如何計算矩陣連乘

就M1.M2.M3.M4就行啊

❸ 用動態規劃方法求【矩陣連乘】最小次序的程序

您好嗎,這樣的:
#include<iostream> using namespace std;
const int MAX = 100;
//p用來記錄矩陣的行列,main函數中有說明
//m[i][j]用來記錄第i個矩陣至第j個矩陣的最優解 //s[][]用來記錄從哪裡斷開的才可得到該最優解 int p[MAX+1],m[MAX][MAX],s[MAX][MAX];
int n;//矩陣個數
int matrixChain() {
for(int i=0;i<=n;i++) m[i][i]=0;
for(int r=2;r<=n;r++)//對角線循環 for(int i=0;i<=n-r;i++)//行循環 {
int j = r+i-1;//列的控制
//找m[i][j]的最小值,先初始化一下,令k=i m[i][j]=m[i+1][j]+p[i+1]*p[i]*p[j +1]; s[i][j]=i;
//k從i+1到j-1循環找m[i][j]的最小值 for(int k = i+1;k<j;k++) {
int temp=m[i][k]+m[k+1][j]+p[i]*p[k+1]*p[j+1];
if(temp<m[i][j]) {
m[i][j]=temp;
//s[][]用來記錄在子序列i-j段中,在k位置處 //斷開能得到最優解 s[i][j]=k; } } }
return m[0][n-1]; }
//根據s[][]記錄的各個子段的最優解,將其輸出 void traceback(int i,int j) {
if(i==j) {
cout<<'A'<<i; return
}
if(i<s[i][j]) cout<<'(';
traceback(i,s[i][j]); if(i<s[i][j]) cout<<')'; if(s[i][j]+1<j) cout<<'(';
traceback(s[i][j]+1,j); if(s[i][j]+1<j) cout<<')'; }
void traceback(){ cout<<'(';
traceback(0,n-1); cout<<')'; cout<<endl; }
int main() {
cout<<"請輸入矩陣的個數:"<<endl; cin>>n;
cout<<"輸入矩陣(形如a*b,中間用空格隔開):"<<endl; for(int i=0;i<=n;i++) cin>>p[i];
//測試數據可以設為六個矩陣分別為
//A1[30*35],A2[35*15],A3[15*5],A4[5*10],A5[10*20],A6[20*25] //則p[0-6]={30,35,15,5,10,20,25} cout<<"輸出結果如下:"<<endl; matrixChain();
traceback(0,n-1);
//最終解值為m[0][n-1]; cout<<endl; return 0;
}

❹ 矩陣連乘問題,這是如何求出的

這是利用矩陣乘法的結合律(但矩陣乘法,一般不滿足交換律)

❺ c++ 矩陣連乘演算法返回值問題

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

voidMatrix_ABC(double*a,double*b,double*c,double*result,intm,intn,intp,intq);

voidmain()
{
intm=3,n=2,p=2,q=4;
doublea[]={1,0,1,0,1,0};
doubleb[]={2,3,2,3};
doublec[]={3,1,3,1,0,0,0,0};

double*result;

result=newdouble[m*q];

inti,j;

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

printf("B ");

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

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

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

delete[]result;

}

voidMatrix_ABC(double*a,double*b,double*c,double*result,intm,intn,intp,intq)
{
inti,j,k;

double*temp;

temp=newdouble[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;
}

❻ 矩陣連乘的問題java.lang.: 3

int m[][]=new int[3][3];
int s[][]=new int[3][3];

數組[3] 下標為 0-2

所以MatrixChain方法中的
for(int i=1;i<=n;i++){
m[i][i]=0;
}
這里的 m[3][3] 就越界了

❼ 怎麼算矩陣連乘

矩陣連乘的優化在演算法裡面 可以用動態規劃解決。
因為矩陣連乘具有可結合性,因此,不同的運算次序(結合次序)花費的計算量是不一樣的。
ABCD=A(BC)D=(AB)(CD)。而演算法裡面矩陣連乘問題的定義就是,給定矩陣(規模很大),確定運算次序,是總計算量最小。
dp[1][n]=min(dp[1][k]*dp[k+1][n]+w(k,k+1))(1<=k<n)。
不知樓主所謂的矩陣連乘是指哪一方面的。

❽ 貪心演算法球矩陣連乘

我覺得不能用貪心法的,我們計算智能的老師也講過,貪心是局部最優,而矩陣連乘問題不具備貪心選擇性質,看過的相關資料也沒能用貪心法成功解決。

❾ 矩陣連乘的遞歸問題

由於輸出是在Traceback內部,因此每次遞歸調用Traceback,只要不是i==j而return,都會執行到cout部分。

i==j時,返回到遞歸調用的上一級了。

熱點內容
verilog編譯結果 發布:2024-12-26 00:10:00 瀏覽:774
u盤啟動安裝linux系統 發布:2024-12-26 00:07:45 瀏覽:494
sizeof編譯 發布:2024-12-26 00:07:01 瀏覽:762
安卓手機什麼是雙卡 發布:2024-12-25 23:54:40 瀏覽:892
dnd伺服器ip地址 發布:2024-12-25 23:48:08 瀏覽:196
cad解壓沒有 發布:2024-12-25 23:48:03 瀏覽:14
超星做題腳本 發布:2024-12-25 23:35:14 瀏覽:909
打開加密pdf 發布:2024-12-25 23:24:57 瀏覽:742
動態sql查詢條件 發布:2024-12-25 23:24:56 瀏覽:304
qq群上傳速度 發布:2024-12-25 23:13:09 瀏覽:480