国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

對稱矩陣的壓縮存儲

2019-11-06 06:32:03
字體:
來源:轉載
供稿:網友

對稱矩陣,相信大家都有所了解,即元素為以主對角線為對稱軸對應相等的矩陣。故而會有許多相等的元素。 這種矩陣如果很大,存儲時必然會浪費很多空間,本文講解對稱矩陣的壓縮存儲。 以如下4*4對稱矩陣為例: 對稱矩陣 本文考慮只存儲對稱矩陣的下三角元素(上三角同樣可行),即下圖灰色部分 對稱矩陣的下三角部分 那么很顯然,我們可以將這樣一個對稱矩陣壓縮存儲到一個一元數組中,從而節省較多的空間,接下來我們分析一下如何存儲。 分析:第一行有一個元素,第二行有兩個元素……第i行有i個元素…… 若對稱矩陣是n*n的,則我們需要一個長度為1+2+…+n的數組來依次存儲每行元素,由如下的等差數列前n項和公式: 等差數列前n項和公式 計算n*n的數組壓縮存儲時所需空間,求得: 轉換公式 以以上矩陣為例,我們需要一個長度為10的數組b來存儲原數組a的所有下三角元素,接下來我們分析如何根據下標i,j獲取到我們需要的那個數字。如根據2,1獲取到下圖中紅框框住的元素2: 根據下標獲取元素 分析:首先,由于我們只存儲了下三角元素,故而在接收到ij時需進行判斷,若i≤j即為上三角的值,需swap(i,j)使得i≥j(因為矩陣是對稱的); 保證ij為下三角的下標后,觀察數組a。 第一行的元素1將存在數組b的第一個位置上, 第二行的兩個元素3、-6將存在數組b的第二、三個位置上 …… 第i行的i個元素將存在數組b的第1+2+…+(i-1)+1個位置上, 即前i-1行元素的個數(第x行有x個元素)+1,存儲形式如下圖所示: 壓縮存儲形式 那么現在我們用C++的模板實現對稱矩陣的壓縮存儲。 成員變量應有T類型的指針_a,原數組(n*n)大小_n; 成員函數除去構造、析構函數,為了防止淺拷貝,應寫出拷貝構造、賦值運算符重載、打印數組函數以及獲取ij下標對應元素的函數。 代碼如下:

template<class T>class SymmetricMatrix{public: SymmetricMatrix() : _a(NULL), _n(0) {} SymmetricMatrix(T* a, size_t n) : _a(new T[(n*(n + 1)) >> 1])//此處用前n項和公式求矩陣壓縮后所需空間大小 , _n(0) { for (size_t i = 0; i < n; ++i) { for (size_t j = 0; j <= i; ++j) _a[_n++] = a[i*n + j]; } _n = n; } SymmetricMatrix(const SymmetricMatrix& matrix) :_a(new T[(matrix._n * (matrix._n + 1)) >> 1]) , _n(matrix._n) { for (size_t i = 0; i < ((_n*(_n + 1)) >> 1); ++i) _a[i] = matrix._a[i]; } SymmetricMatrix& Operator=(SymmetricMatrix matrix) { swap(_a, matrix._a); swap(_n, matrix._n); return *this; } ~SymmetricMatrix() { delete[] _a; _a = NULL; }public: void PRint() { for (size_t i = 0; i < _n; ++i) { for (size_t j = 0; j < _n; ++j) { if (i >= j)// 此時ij標志下三角元素 cout << Get(i, j) << " "; else // 此時ij標志上三角元素,需交換獲取值 cout << Get(j, i) << " "; } cout << endl; } } T& Get(size_t i, size_t j) { return _a[(i*(i + 1) >> 1) + j]; }protected: T* _a; size_t _n;};

本博文若有何錯誤不足之處,歡迎大家一起交流或批評指正! 喜歡的朋友請點贊噢n(≧▽≦)n!!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 广灵县| 横峰县| 瑞金市| 综艺| 惠东县| 宁乡县| 新化县| 红原县| 河间市| 枣阳市| 琼中| 柳林县| 连平县| 郸城县| 巧家县| 万盛区| 夏津县| 郑州市| 伊吾县| 获嘉县| 安平县| 县级市| 综艺| 乐业县| 会东县| 巴东县| 蓝田县| 肇州县| 建德市| 万年县| 古浪县| 宜丰县| 龙门县| 翁牛特旗| 万安县| 绥德县| 醴陵市| 开远市| 五台县| 衡阳县| 崇左市|