void trans_spm(spm *orig, spm *trans) { // sofar is the index for trans int col, i, sofar = 1; // initialize matrix info int TotalCol = trans[0].row = orig[0].col; trans[0].col = orig[0].row; int TotalElements = trans[0].val = orig[0].val; // loop with column index for (col = 0; col < TotalCol; col++) // search all over the elements // for the same column for (i = 1; i <= TotalElements; ++i) if (orig[i].col == col) { // add the same column elements to trans trans[sofar].row = col; trans[sofar].col = orig[i].row; trans[sofar].val = orig[i].val; sofar++; } }sparse matrix的轉置矩陣,其做法的原理很簡單,首先的資料部分row 和column數目對調就是轉置的結果,總element數目不變。接著再以column為主,從原先的矩陣依照(column, row)的順序把每一個element抽出來放到轉置矩陣去。
因此首先有dummy index:
int col, i, sofar = 1;col是給column用的index,為了loop in column。而i則是跑全部的element。sofar則是記錄目前在轉置矩陣上的index。
接著把矩陣資料排好給轉置矩陣後,就開始依據(column, row)的順序把element從原矩陣中抽出。
for (col = 0; col < TotalCol; col++)因為我們要排的是轉置的矩陣,因此原先的矩陣排列方式是(row, column),那麼現在的轉置矩陣就會是原矩陣的相反(column, row)。首先的迴圈就run over all column的index去依據column大小的順序去排列轉置矩陣。
for (i = 1; i <= TotalElements; ++i) if (orig[i].col == col) { // add the same column elements to trans trans[sofar].row = col; trans[sofar].col = orig[i].row; trans[sofar].val = orig[i].val; sofar++; }我們便每次都從第一個element開始排列順序,我們每一次一個column都會從頭從原矩陣的每個element找起,找的目標就是當下的column,比如我們開始排列第0個column,那麼我們便從原矩陣找column為0的。而原矩陣的row和column早就已經排列過了,因此我們就按照element的順序去找起即可,而不需要考慮row的順序。當我們找到當下的column的時候,便把這個element assign給轉置矩陣,當然row和column是要對調的,而值是相同的。因此按照這樣的邏輯下去這個轉置矩陣變這樣完成。
沒有留言:
張貼留言