在編寫程式時往往都是二維陣列表示矩陣,然而在數值分析中經常出現一些階數很高的的矩陣同時在距震中有很多值相同的元素,或者是零元素,為了節省空間,可以對這類矩陣進行壓縮儲存,所謂的壓縮儲存就是,多個值相同的元之分配乙個儲存空間,對零元不分配空間。
若值相同的元素或零元素在矩陣中分布有一定規律,則稱矩陣為特殊矩陣,反之稱為稀疏矩陣。
按照壓縮儲存的概念,只儲存非零元素,所以需要儲存非零元素的值,以及它在矩陣中所在的位置(i,j),乙個三元組(i,j,aij)唯一確定了矩陣的乙個非零元。
每個三元組需要非零元的下標,以及存放的資料。整個三元組表包括n個三元組以及三元組表資訊,矩陣行數,列數,非零元個數。
typedef int element;
#define maxsize 12500 //假設非零元素的最大值為12500
typedef struct tripletriple;
typedef struct tsmatrixtsmatrix;
先建立乙個係數矩陣,初始化行列數,以及非零元素個數,根據非零元素個數,輸入元素所在位置,以及元素值。
//建立稀疏矩陣
tsmatrix createsmatrix()
return s;
}
初始設定變數k,用來遍歷三元組表,通過兩個for語句遍歷整個稀疏矩陣,若對應的(i,j)等於在三元組表data【k】中的(i,j),則該位置有非零元素,輸出該非零元素,k自增,否則輸出零元素。在列印一行後換行,整個矩陣列印結束後也要換行。下面說明列印稀疏矩陣:
//列印稀疏矩陣
void printsmatrix(tsmatrix t) else
}printf(" \n");
}printf("\n");
}
矩陣的轉置是矩陣的基本操作,我們需要準備乙個全是零元素的矩陣儲存轉置矩陣,初始化轉置矩陣的行列,以及非零元素個數,設定乙個變數q用來遍歷三元組表待轉置矩陣,設定變數col代表列(待轉置矩陣的列就是轉置矩陣的行),通過for迴圈列,通過for迴圈待轉置矩陣的所有三元組,判斷待轉置矩陣的元素的列是否是要轉置的列(保證從第一列開始轉置),若是則:轉置矩陣非零元素位置等於待轉置矩陣行列交換的位置,並儲存非零元素。下面說明轉置矩陣:
tsmatrix transposesmatrix(tsmatrix m,tsmatrix t)}}
}return t;
} //transposesmatrix
若果能夠預先確定待轉置矩陣m中每一列的的非零元素,在轉置矩陣t三元組表的位置,那麼轉置的時候,便可以直接放到相應的位置上。為了確定位置,在轉置之前必須求得待轉置矩陣m的每一列中非零元素個數,進而求得每一列的第乙個非零元素在轉置矩陣t中應有的位置,下面說明快速轉置矩陣:。
tsmatrix fasttransposesmatrix(tsmatrix m,tsmatrix t)
for(t = 1;t <= m.nu; ++t)
cpot[1] = 1;
//求第col列中第乙個非零元素在b.data中的序號
for(col = 2 ; col <= m.nu; ++col)
for(p = 1;p <= m.tu; ++p) // for
} // if
return t;
}
附上矩陣壓縮儲存完整**triple 矩陣的壓縮儲存
一 壓縮儲存 指為多個值相同的元只分配乙個儲存空間,對零元不分配空間。二 矩陣分類 1 假如值相同的元素或者零元素在矩陣中的分配有一定的規律,則我們稱此類矩陣為特殊矩陣 反之,稱為稀疏矩陣。2 n階對稱矩陣 滿足aij aji 1 i,j n 3 稀疏矩陣 非零元較零元少,且分布沒有規律。三 n階對...
矩陣的壓縮儲存
我的離散老師一直建議我們用矩陣來儲存資訊,尤其是兩個事物的關係資訊 比如兩個元素相關聯,比如圖 但如果要儲存的關係是雙向的,也就是無向圖,那麼用矩陣就會造成部分浪費,比如從a到b有路徑,那麼只需要在陣列 a b 位置置1即可,b a 再置1就顯得浪費了 這種關係矩陣往往是對稱矩陣所以需要 給相同元素...
矩陣壓縮儲存
在c中矩陣的表示是用二維陣列。那麼首先要搞清楚陣列行列與矩陣行列的對應。在c語言中二維陣列是按行儲存的。即順序儲存每一行。第一行,第二行。最後一行 看一下例子 陣列數量替換成arrs i j 方便說明。int arrs i j test 二維陣列記憶體位置 for i 0 i 3 i 在上例中i表示...