日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

矩阵乘法和快速幂的一些优化和剪枝

發布時間:2025/3/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 矩阵乘法和快速幂的一些优化和剪枝 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

矩陣相乘

一般會用O(n^3)的方法。。。配合剪枝【添條件,設門檻。。。】

//O(n^3)算法 #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <algorithm> using namespace std; #define LL __int64 #define MOD 1000 typedef struct MATRIX { int mat[50][50]; }MATRIX; MATRIX mat_multiply (MATRIX a,MATRIX b,int n) { MATRIX c; //c[i][j]= Σ a[i][k]*b[k][j] memset(c.mat,0,sizeof(c.mat)); /* for(int i=0;i<n;i++) //a矩陣一行一行往下 for(int j=0;j<n;j++) //b矩陣一列一列往右 for(int k=0;k<n;k++) //使a矩陣 第i行第k個元素 乘以 b矩陣 第j列第k個元素 if(a[i][k] && b[k][j]) //剪枝(添條件,設門檻),提高效率,有一個是0,相乘肯定是0 c.mat[i][j]+=a.mat[i][k]*b.mat[k][j]; */ //上面也是可以的,但是下面的剪枝更好一些,效率更高一些,但是運算順序有點難想通,,, //上面就是C[i][j]一次就求出來,下面就是每次c[i][j]求出一項【就是上面紅體字,每次各求一列】 for(int k=0;k<n;k++) //這個可以寫到前面來, for(int i=0;i<n;i++) if(a.mat[i][k]) //剪枝:如果a.mat[i][k]是0,就不執行了 for(int j=0;j<n;j++) if(b.mat[k][j]) //剪枝:如果b.mat[i][k]是0,就不執行了 { c.mat[i][j]+=a.mat[i][k]*b.mat[k][j]; if(c.mat[i][j]>=MOD) //這個看實際需求,要不要取模 c.mat[i][j]%=MOD; //取模的復雜度比較高,所以盡量減少去模運算,添加條件,只有當大于等于MOD的時候才取余 } return c; } int main()<span style="white-space:pre"> </span>//這個只是用來測試用的。。。 { int n; MATRIX A,B,C; memset(A.mat,0,sizeof(A.mat)); memset(B.mat,0,sizeof(B.mat)); memset(C.mat,0,sizeof(C.mat)); scanf("%d",&n); //矩陣規模,這里是方陣,行數等于列數 for(int i=0;i<n;i++) //初始化A矩陣 for(int j=0;j<n;j++) scanf("%d",&A.mat[i][j]); for(int i=0;i<n;i++) //初始化B矩陣 for(int j=0;j<n;j++) scanf("%d",&B.mat[i][j]); C=mat_multiply (A,B,n); for(int i=0;i<n;i++) //打印C矩陣 { for(int j=0;j<n;j++) printf("%3d",C.mat[i][j]); printf("\n"); } return 0; }

矩陣快速冪

//矩陣快速冪 #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <algorithm> using namespace std; #define LL __int64 #define MOD 1000 typedef struct MATRIX { int mat[50][50]; }MATRIX; MATRIX mat_multiply (MATRIX a,MATRIX b,int n) { MATRIX c; //c[i][j]= Σ a[i][k]*b[k][j] memset(c.mat,0,sizeof(c.mat)); /* for(int i=0;i<n;i++) //a矩陣一行一行往下 for(int j=0;j<n;j++) //b矩陣一列一列往右 for(int k=0;k<n;k++) //使a矩陣 第i行第k個元素 乘以 b矩陣 第j列第k個元素 if(a[i][k] && b[k][j]) //剪枝(添條件,設門檻),提高效率,有一個是0,相乘肯定是0 c.mat[i][j]+=a.mat[i][k]*b.mat[k][j]; */ //上面也是可以的,但是下面的剪枝更好一些,效率更高一些,但是運算順序有點難想通,,, //上面就是C[i][j]一次就求出來,下面就是每次c[i][j]求出一項【就是上面紅體字,每次各求一列】 for(int k=0;k<n;k++) //這個可以寫到前面來, for(int i=0;i<n;i++) if(a.mat[i][k]) //剪枝:如果a.mat[i][k]是0,就不執行了 for(int j=0;j<n;j++) if(b.mat[k][j]) //剪枝:如果b.mat[i][k]是0,就不執行了 { c.mat[i][j]+=a.mat[i][k]*b.mat[k][j]; if(c.mat[i][j]>=MOD) //這個看實際需求,要不要取模 c.mat[i][j]%=MOD; //取模的復雜度比較高,所以盡量減少去模運算,添加條件,只有當大于等于MOD的時候才取余 } return c; } MATRIX mat_quick_index(MATRIX a,int N,int n) { MATRIX E; //單位矩陣,就像數值快速冪里,把代表乘積的變量初始化為1 // memset(E.mat,0,sizeof(E.mat)); //置零,單位矩陣除了主對角線都是1,其他都是0 // for(int i=0;i<n;i++) //初始化單位矩陣【就是主對角線全是1】 // E.mat[i][i]=1; for(int i=0;i<n;i++) for(int j=0;j<n;j++) E.mat[i][j]=(i==j); //酷炫*炸天的初始化!!! while(N>0) { if(N & 1) E=mat_multiply(E,a,n); N>>=1; a=mat_multiply(a,a,n); } return E; } int main() { int n,N; //n為矩陣(方陣)規模,幾行,N為指數 MATRIX A,C; memset(A.mat,0,sizeof(A.mat)); memset(C.mat,0,sizeof(C.mat)); scanf("%d",&n); //矩陣規模,這里是方陣,行數等于列數 for(int i=0;i<n;i++) //初始化A矩陣 for(int j=0;j<n;j++) scanf("%d",&A.mat[i][j]); scanf("%d",&N); C=mat_quick_index(A,N,n); for(int i=0;i<n;i++) //打印C矩陣 { for(int j=0;j<n;j++) printf("%3d",C.mat[i][j]); printf("\n"); } return 0; }

總結

以上是生活随笔為你收集整理的矩阵乘法和快速幂的一些优化和剪枝的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。