什麼是對稱矩陣(symmetricmatrix)?
對稱對稱-------看
設乙個n*n的方陣a,a中任意元素aij,當且僅當aij == aji(0 <= i <= n-1 && 0 <= j <= n-1),則矩陣a是對稱矩陣。以矩陣的對角線為分隔,分為上三角和下三角。
壓縮存就是矩陣儲存時只需要儲存上三角/下三角的資料,所以最多儲存n(n+1)/2個資料。
對稱矩陣和壓縮儲存的對應關係:下三角儲存i>=j, s
那麼,我們該如何儲存呢?
按照一元陣列的方法,儲存下三角的元素即可。
templateclass symmetricmatrix
else
}} }
public:
void display()
else //上三角位置
}cout <
} cout <
} //獲取某行某列元素
t& access(size_t i, size_t j)
return _data[i*(i + 1) / 2 + j];
}protected:
t* _data;
size_t _size;
size_t _n;
};
什麼又是稀疏矩陣呢?
壓縮儲存值儲存極少數的有效資料。使用
三元組儲存每乙個有效資料,三元組按原矩陣中的位置,
以行優先順序先後順序依次存放。
首先構建三元組(這裡的每乙個三元組就是矩陣中的乙個元素)
templatestruct triple
};
再儲存有效值。
建立乙個類,在建構函式中我們實現有效值的儲存
sparsematrix(t* a, size_t m, size_t n, const t& invalid)
:_rowsize(m)
, _colsize(n)
, _invalid(invalid)
}} }
sparsematrix()
:_rowsize(0)
, _colsize(0)
, _invalid(0)
{}
這裡還有乙個矩陣轉置。何為矩陣轉置呢?
*矩陣轉置
將原矩陣的行、列對換,也就是將[i][j]和[j][i]位置上的資料對換。
}你們有沒有發現普通轉置的效率太低,時間複雜度太高?它的時間複雜度為o(列數*有效資料的行數),那我接下來就給大家介紹快速轉置。
快速轉置,只需要遍歷一次儲存的有效資料。這個怎麼做到呢?
我們需要得出轉置後每一行有效值的個數和每一行第乙個有效值在壓縮矩陣中的起始位置。
即rowcounts = ;
rowstart = ;
我們可以看出 rowstrat[0] 總是恒為 0,那很容易就可以發現
rowstart[i] = rowstart[i - 1] + rowcounts[i - 1];
再看**
sparsematrixfasttransport()
rowstart[0] = 0;
for (size_t i = 1; i
//定位位置
index = 0;
while (index
delete rowcounts;
delete rowstart;
return tmp;
}
接下來我們繼續使用行優先的原則將壓縮矩陣列印出來
void display()
else
}cout <
} cout <
}
最後再補上我們類的成員變數
protected:
vector> _a;
size_t _rowsize;
size_t _colsize;
t _invalid;
這
就是我們的快速轉置了。小夥伴們好好看哦。我會繼續努力噠~
對稱矩陣 稀疏矩陣的壓縮儲存
對稱矩陣 稀疏矩陣的壓縮儲存 1 對稱矩陣的壓縮儲存 對稱矩陣顧名思義就是符合行和列的個數相同,並且矩陣中儲存的資料上三角和下三角中對應位置上的元素值是相等的。為了能夠減少儲存的空間,我們可以只儲存上三角矩陣 或者下三角矩陣中的元素,這樣就能夠極大地節省空間的浪費。下面是對稱矩陣的示列 假設對稱矩陣...
矩陣 對稱矩陣及稀疏矩陣的壓縮儲存
1.稀疏矩陣 稀疏矩陣及其壓縮儲存 pragma once include include using namespace std templatestruct triple template class sparsematrix sparsematrix t arr,size t row,size...
對稱矩陣 壓縮儲存
對稱矩陣及對稱矩陣的壓縮儲存 設乙個n n的方陣a,a中任意元素aij,當且僅當aij aji 0 i n 1 0 j n 1 則矩陣a是對稱矩陣。以矩陣的對角線為分隔,分為上三角和下三角。壓縮儲存稱矩陣儲存時只需要儲存上三角 下三角的資料,所以最多儲存n n 1 2個資料。對稱矩陣和壓縮儲存的對應...