1. 程式人生 > >資料結構::矩陣(一)--對稱矩陣及對稱矩陣的壓縮儲存

資料結構::矩陣(一)--對稱矩陣及對稱矩陣的壓縮儲存

【對稱矩陣】

1、定義:元素以對角線為對稱軸對應相等的矩陣。

     設一個N*N的方陣A,A中任意元素Aij,當且僅當Aij == Aji(0 <= i <= N-1
&& 0 <= j <= N-1),則矩陣A是對稱矩陣。以矩陣的對角線為分隔,分為上三
角和下三角。

【對稱矩陣的壓縮儲存】:

1、壓縮儲存稱矩陣儲存時只需要儲存上三角/下三角的資料,所以最多存
n(n+1)/2個數據。
2、對稱矩陣和壓縮儲存的對應關係:下三角儲存i>=j, SymmetricMatrix[i][j] ==
Array[i*(i+1)/2+j]

**下面給出對稱矩陣的實現程式碼**:

#include<iostream>
using namespace std;
template<typename T>
class SymmetricMatrix
{
public:
	//建構函式
	SymmetricMatrix()
	{}
	SymmetricMatrix(T* a, size_t n)
		:_a(new T[n*(n+1)/2])
		,_n(n)
	{
		size_t index = 0;
		for(size_t i= 0; i<_n; i++)
		{
			for(size_t j = 0; j<_n; j++)
			{
				if(i >= j)
				{
					_a[index] = a[i*n+j];
					index++;
				}
				else
				{
					break;
				}
			}
		}
	}
	//解構函式
	~SymmetricMatrix()
	{
		if(_a)
		{
			delete[]_a;
		}
	}
	//判斷陣列是否是訪問下三角的
	T& Access(size_t i,size_t j)
	{
		if(i <= j)
		{
			std::swap(i,j);
		}
		return _a[i*(i+1)/2+j];
	}
	//列印對稱矩陣
	void Print()
	{
		for(size_t i = 0; i<_n; i++)
		{
			for(size_t j = 0; j<_n; j++)
			{			
				cout<<Access(i,j)<<" ";
			}
			cout<<endl;
		}
		cout<<endl;
	}
protected:
	T* _a;      //用二維陣列儲存,用一維陣列進行讀取 
	size_t _n;   //因為是n*n的,直接給n就可以了

};
void Test()
{
	int a [5][5]=
	{
	{0,1,2,3,4},
	{1,0,1,2,3},
	{2,1,0,1,2},
	{3,2,1,0,1},
	{4,3,2,1,0},
	};
	SymmetricMatrix<int> sm((int*)a,5);
	sm.Print();
}
int main()
{
	Test();
	return 0;
}


相關推薦

資料結構排序

插入排序:直接插入排序,希爾排序 直接插入排序: 穩定性:不改變相同關鍵字序列,穩定 ASL: : 解釋說明: 序 號:0 1 2 3 4 5 6 7 8 監視哨: 34 12 49 28 31 52 51 49* 第一趟: 34 第二趟: 12 34 第三趟: 12 3

資料結構實現:動態陣列C++版

資料結構實現(一):動態陣列(C++版) 1. 概念及基本框架 2. 基本操作程式實現 2.1 增加操作 2.2 刪除操作 2.3 修改操作 2.4 查詢操作 2.5 其他操作 3. 演算法複雜度分析

資料結構學習:高精度演算法

高精度演算法,屬於處理大數字的數學計算方法。在一般的科學計算中,會經常算到小數點後幾百位或者更多,當然也可能是幾千億幾百億的大數字。一般這類數字我們統稱為高精度數,高精度演算法是用計算機對於超大資料的一種模擬加,減,乘,除,乘方,階乘,開方等運算。對於非常龐大的數字無法在計算機中正常儲存

資料結構淺析資料結構基本概念

轉載自https://m.meiwen.com.cn/subject/kzgvhttx.html 首先會有個疑問,什麼是資料結構呢? 資料結構(data structure),可以概括為是互相之間存在一種或多種特定關係的資料元素的集合。 開篇配圖

資料結構入門棧的實現

  從這一篇文章開始,筆者將會正式進入資料結構的領域,後面也將會持續更新。   本文將會講述一種特殊的線性表結構:棧(stack)。   棧,是限定僅在表尾進行插入或刪除操作的線性表。因此,對棧來說,表尾端有其特殊含義,稱為棧頂(top),相應地,表頭端稱為棧底(bottom)。不含任何元素的空表稱為空棧。

【 C# 資料結構 -------------------------- 泛型帶頭節點的單鏈表,雙向連結串列實現

在程式設計領域,資料結構與演算法向來都是提升程式設計能力的重點。而一般常見的資料結構是連結串列,棧,佇列,樹等。事實上C#也已經封裝好了這些資料結構,在標頭檔案 System.Collections.Generic 中,直接建立並呼叫其成員方法就行。不過我們學習當然要知其然,亦知其所以然。 本文實現的是連結

C與資料結構——概述

    引言:  未進職場,真正接觸產品開發之前,基礎還是才是最重要的。大學的好處就是隨心所欲的學。怎麼理解就怎麼理解,不違規,不犯法。呵呵,從今天開始的一段時間,我開始將c語言和資料結構的理解寫寫,算大學的最後珍惜了。一千個讀者就有一千個哈姆雷特。錯與對無關緊要。也許今日膚

資料結構::迷宮--棧的一個應用

【前情描述】:我們先來看一張圖片:    (在這張圖片裡我們用“1”來表示牆,用“0”來表示通路。紅色方塊表示入口點,綠色方塊表示出路)  我們要從迷宮的出口開始走找出路,即紅色走到綠色,那麼怎麼解決這個問題呢?彆著急,往下看,聽我細細講解: 【解決迷宮問題】: 方法一:利

淺析C#資料結構—集合

        定義:結構化的資料型別        分類:可分為非線性集合和線性集合        集合的描述:                       1.直接存取集合                             陣列、字串、stuct          

資料結構::矩陣--對稱矩陣對稱矩陣壓縮儲存

【對稱矩陣】: 1、定義:元素以對角線為對稱軸對應相等的矩陣。      設一個N*N的方陣A,A中任意元素Aij,當且僅當Aij == Aji(0 <= i <= N-1&&a

C語言資料結構之稀疏矩陣

最近開始學習C語言的稀疏矩陣的一些知識,現在簡單的整理梳理一下知識脈絡,僅供自己總結學習,歡迎技術指正,拒絕盲噴。 1.首先先介紹一下關於稀疏矩陣的一些基礎知識,關於稀疏矩陣,一直都沒有過很清楚詳細的定義。簡單的說,在M*N的一個矩陣中,假設有t個元素不為0,那麼有計算公

matlab矩陣--如何控制矩陣中小數點的位數

數字 hex git png 它的 類型 整型 cal -s format:設置輸出格式對浮點性變量,缺省為format short.format並不影響matlab如何計算和存儲變量的值。對浮點型變量的計算,即單精度或雙精度,按合適的浮點精度進行,而不論變量是如何顯示的。

機器學習之數學基礎-微積分,概率論和矩陣

系列 學習 python 機器學習 自然語言處理 圖片 clas 數學基礎 記錄 學習python快一年了,因為之前學習python全棧時,沒有記錄學習筆記想回顧發現沒有好的記錄,目前主攻python自然語言處理方面,把每天的學習記錄記錄下來,以供以後查看,和交流分享。~~

DOO-SABIN 細分正方體2利用半邊資料結構表示次和兩次細分

#include <windows.h> #include <math.h> #include <gl/GL.h> #include <GL/glut.h> //static const GLfloat ve

數據結構數組特殊矩陣壓縮存儲

ron 定義 邏輯結構 特定 個性 -s 中心 href 基址 特殊矩陣的壓縮存儲 數組   數組可以看作線性表的推廣。數組作為一種數據結構其特點是結構中的元素本身可以是具有某種結構的數據,但屬於同一數據類型,數組是一個具有固定格式和數量的數據有序集, 每一個數據元素有

數據結構基礎

數據結構線性表 線性順序表 1、線性表的數據操作 2、使用定義的函數實現兩個集合LA和LB的合並: void unionList(List LA,List LB,List &LC) { int lena,i; ElemType e; InitList(LC); //將

從零開始Rtklib解讀篇-簡單的程式設計理論和演算法結構分析

Rtklib一直開源,資源比較容易找到,功能也非常強大。因為專業有點相關,但是之前不用這個平臺,一直未能好好沉下心來學習,然而學到用時方恨少。這個系列也算是自己的一個小小的總結吧,因為我對VS、對Rtklib、對演算法的理解也比較淺,很多內容未必正確,寫的時候也不一定非常有條理,不當之處,還請指出並

資料之Spark--- Spark簡介,模組,安裝,使用,一句話實現WorldCount,API,scala程式設計,提交作業到spark叢集,指令碼分析

一、Spark簡介 ---------------------------------------------------------- 1.快如閃電的叢集計算 2.大規模快速通用的計算引擎 3.速度: 比hadoop 100x,磁碟計算快10x 4.使用: java

資料之scala --- 安裝scala,簡單語法介紹,條件表示式,輸入和輸出,迴圈,函式,過程,lazy ,異常,陣列

一、安裝和執行Scala解釋程式 --------------------------------------------- 1.下載scala-2.11.7.msi 2.管理員執行--安裝 3.進入scala/bin,找到scala.bat,管理員執行,進入scala命

資料結構——圖2——圖的儲存和表示方式.md

圖的儲存方式 在實踐中,圖最常見的策略是: 將每個節點的連線儲存在鄰接列表中。 將整個圖形的連線儲存在鄰接矩陣中。 用鄰接連結串列來表示圖之間的關係 在圖中表示連線的最簡單方法是在每個節點的資料結構中儲存與其連線的節點的列表。該結構稱為鄰接列表。 例如