矩陣相乘 高效實現方法

2021-05-22 12:36:26 字數 1118 閱讀 2031

假如有兩個矩陣m,n相乘,q= m x n,m是m1 x n1矩陣, n是 m2 x n2。 只有當n1 = m2時,才可以進行兩個矩陣的相乘。一般的做法是:(1)我們用兩個二維陣列分別存放 m 和 n ,然後再用乙個二維陣列 存放 q。實現 q = m x n的演算法如下:(下標從1開始)

for( i = 1; i<= m1; ++i)

for(j = 1; j <= n2; ++j)

q[ i ][ j ] = 0;

for( k = 1; k<= n1; ++k)

q[ i ][ j ] += m[ i ][ k ] * n[ k ][ j ];

這種方法需要的記憶體空間是:sizeof( elemtype ) * ( m1 * n1 + m2 * n2 + m1 * n2)

時間複雜度分別是:o( m1 * n2 * n1);  

假如m和n都是稀疏矩陣(非零元素很少),我們假設m 的是 50 x 60的矩陣,非零元素為:10。 n 是 60 x 60的矩陣,非零元素為:10。因為兩個元素相乘,其中乙個為零結果也就為零。我們要的只是非零的資料。如果按上面那種方法,將會浪費很多空間。於是我們考慮用另一種方式儲存矩陣。那就是典型的「三元組」,用個結構體表示這種儲存結構。乙個存行座標,乙個存列座標。乙個存它的值。這就是著名的三元組法。可以得出如果用三元組儲存以前資料,需要的空間是 m 和n都只需要 10 * sizeof(struct)。比起儲存 60 x 60和60 x 50的空間節省了很多。這從空間上解決了問題。兩外如果用三元組方法儲存資料(非零資料)也方便我們做乘法運算,減少了零元素的相乘。這不是一舉兩得嗎。

三元組結構:

#define  maxsize  12500

struct  triple  ;  // 三元組型別

struct   tsmatrix ;  // 稀疏矩陣型別

在這裡還有乙個很重要的作法,因為我們把非零元素按三元組的形式存放在陣列中,而且是按行序為主序存放的。所以為了方便快速知道第x行的開頭在陣列中第幾個位置,我們引入了乙個陣列cpot。num陣列存的是每行非零元的個數。它用來存放每一行的開頭非零元素在陣列data的位置(既是下標)。作法如下 三元組m和n

///mn的cpot

if (m.tu) ;

} // 壓縮儲存該行非零元

Java實現矩陣相乘

首先我們要知道二維陣列就是類似於我們線性代數中的矩陣,矩陣的乘法運算大概是這樣 滿足條件,第乙個矩陣的列數等於第二個矩陣的行數 由兩個矩陣相乘的矩陣的每乙個元素是由第乙個矩陣每一行元素分別乘上第二個矩陣的列 對應的元素在相加 當矩陣a的列數等於矩陣b的行數時,a與b可以相乘。矩陣c的行數等於矩陣a的...

MPI實現矩陣相乘

配置mpi 配置目錄,即載入include和lib庫 載入依賴項 3.編譯 根據程式設計員的習俗先從乙個helloworld開始 include mpi.h include int main int argc,char ar 4.mpi 矩陣相乘 接下來便開始我們的主題 實際的思想是使用0程序將矩陣...

實現稀疏矩陣相乘C C

1 問題描述 已知稀疏矩陣a m1,n1 和b m2,n2 求乘積c m1,n2 a 3 0 0 7 b 4 1 c 12 17 0 0 0 1 0 0 0 2 0 2 0 0 1 1 0 0 0 2 a b c的三元組表示法分別為 a ijv1112 2147 324 1 4322 b i jv1...