① 數據結構-特殊矩陣的壓縮存儲
本文介紹對稱矩陣、三角矩陣、對角矩陣和稀疏矩陣的壓縮存儲方法。
在一個n階矩陣A中,若元素滿足aij=aji,0<=i,j<=n-1,則稱矩陣A為對稱矩陣。
按行優先順序將這些元素存放在一個一維數組s[n(n+1)/2]中,元素aij在s中對應的下標為k:
以主對角線劃分,三角矩陣分為上三角和下三角兩種,上三角矩陣的下三角所有元素均為常數c,下三角矩陣正好相反。
按行優先順序將三角矩陣存放在一維數組s[n(n+1)/2+1],其中常數c存放在數組的最後一個分量中。
上三角矩陣元素aij在s中對應的下標為k:
下三角矩陣元素aij在s中對應的下標為k:
對角矩陣是指矩陣中所有的非零元素集中在以主對角線為中心的帶狀區域中。一個k對角矩陣(k為奇數)A滿足若|i-j|>(k-1)/2則元素aij=0。
將三對角矩陣A中的非零元素按行優先順序存放到數組s[3n-2]中,在三對角矩陣A中,除第一行和最後一行只有兩個非零元素外,其他每行中均有三個非零元素。三對角矩陣中的元素aij在s中對應的下標為 k=3×i-1+j-(i-1)=2×i+j .
設矩陣Amn中有s個非零元素,若s遠遠小於矩陣元素的總數,即s<<mxn,則稱A為稀疏矩陣。
對於稀疏矩陣的壓縮存儲方法通常有兩種,分別是三元組順序表和十字鏈表。
1. 三元組順序表
每個元素是一個結構體,包括該元素在矩陣中的行數、列數和數值,所有元素存在一個向量vector中,並同時記錄矩陣的行數、列數及非零元素個數等信息。
2. 十字鏈表
為了克服順序表中對非零元素插入和刪除操作帶來的不便,採用鏈接存儲結構存儲稀疏矩陣。
十字鏈表將每個元素存儲為一個結構體,除了包括元素的行號、列號、數值外,還包括一個向右指針域用於指向同一行中的下一個非零元素和一個向下指針域用於指向同一列中的下一個非零元素。所有結構體通過兩個一維指針數組分別存儲各個行鏈表的頭指針和各個列鏈表的頭指針組織成一個整體。
目標是將每個元素的行號列號交換,並按照新的行列號按序存放。關鍵在於如何高效地進行按序存放。
方法一:樸素轉置演算法
按照原列號分別從頭至尾掃描,依次放入新的矩陣中。對於一個m行n列且非零元素個數為t的稀疏矩陣而言,該演算法的時間復雜度為O(t×n)。
方法二:快速轉置演算法
採用一個數組cnum[cols]記錄每一列中的元素個數,一個數組cpot[cols]記錄每一列的第一個非零元素在轉置矩陣順序表中的下標。cnum和cpot各採用一次遍歷得到,其中cpot[0]=0,cpot[col]=cpot[col-1]+cnum[col-1]。
② 在MATLAB中,「矩陣元素的序號和下標可以相互轉換」,這句話怎麼理解謝謝
例如矩陣a
>> a=[1 2 3; 4 5 6 ]
a =
1 2 3
4 5 6
則a(1,1)=1, a(2,3)=6,其中,a(1,1)表示a的第一行第一列的元素,a(2,3)表示a的第二行第三列的元素。(1,1)和 (2,3)就是下標(Subscript )。矩陣元素的序號就是矩陣元素的存儲順序,在這個例子中這個矩陣中的元素的存儲順序是1 4 2 5 3 6, 第4個元素即a(4)=5 。
「矩陣元素的序號和下標可以相互轉換」,這句話就是說a(4)和a(2,2)一樣,a(2)和a(2,2)一樣,a(5)和a(1,3)一樣。參見help sun2ind 。
可以通過下標(行列索引)引用矩陣的元素,如 Matrix(m,n)。也能用元素的序號來引用矩陣元素。矩陣元素的序號就是相應元素在內存中的擺列順序。在MATLAB中,矩陣元素按列儲存,先儲存頭列,再第二列,依次類推。序號(Index)與下標(Subscript )是一一對應的,以m*n矩陣A為例,矩陣元素A(i,j)的序號為(j-1)*m+i。其彼此轉換關系也可利用sub2ind和ind2sub函數求得。
③ 矩陣M23是什麼
矩陣M23是:
在實現中通常將其存儲為一個一維的線性數組如float matrix【16】或者float* matrix。
在opengl中這個matrix中數據的順序是先遍歷列的,線性存儲為{m11,m21,m31,m41,m12,m22,m32......},這被稱為矩陣的列序(column-major)存儲,我們使用GlGetfloatv(GL_MODELVIEW_MATRIX,...)等得到的存儲矩陣的數組都是按照這樣的順序存儲矩陣的。
但是在cg中這個matrix的存儲順序確實先遍歷行的,也就是存儲為{m11,m12,m13,m14,m21,m22,m23,m24,m31,......},稱為行序(row-major)存儲,可能多數人認為這種存儲順序更「自然」,(其實我也這么覺得),這種存儲方式也被稱為是c-style的,好像是大多數系統里是按照行序存儲矩陣的。
不同的系統對矩陣的存儲方式不一樣,如果在程序中綜合使用了不同的框架,就要注意進行統一了,比如你在opengl 中使用了CG腳本的時候,例如一個cg程序void programm(uniform float4x4 modelviewMatrix,... ...)要求你從程序中傳入一個modelview矩陣,我們在程序中使用opengl的GlGetfloatv()函數得到了float* glmatrix 為這個modelview矩陣,但是這個glmatrix確不能直接賦給modelviewMatrix供cg使用,因為cg在解析這個glmatrix 會把它解析為行序的,我們可以在讓modelviewMatrix得到glmatrix 後,調用transfor()將modelviewMatrix做一個轉置,modelviewMatrix就變成cg所能正確解析的行序的了。
行序和列序的轉換其實就是一個矩陣的轉置關系,雖然這個變換很簡單,但是在使用不同的框架時,要記得先注意一下這個系統式採用哪種方式存儲矩陣的,才不會犯錯。
④ 上三角矩陣按行優先存儲公式
題目出錯了,上三角肯定是 i<=j
公式也不對,怎麼可能跟n無關呢,第i行的元素個數是n-i+1,
a(i,j)前面有i-1行,這i-1行共有(n-1+1)+...+(n-(i-1)+1)個元素,第i行有j-i+1,加在一起再減1就是k(因為數組下標為0)
⑤ 利用稀疏矩陣的順序存儲實現稀疏矩陣的加、減、乘、轉置等簡單運算。 這是課題要求,求大佬用c語言。
內容
假設兩個稀疏矩陣A和B,他們均為m行n列,要求表寫求矩陣的加法即:C=A+B的演算法(C矩陣存儲A與B相加的結果)
分析
利用一維數組來存儲,一維數組順序存放非零元素的行號、列號和數值,行號-1表示結束,然後進行矩陣加法運算時依次掃描矩陣A和B的行列值,並以行優先。當行列相同的時候,將第三個元素的值相加和以及行列號三個元素存入結果數組C中;不相同時,將A或B的三個元素直接存入結果數組中。
代碼
// fanchen.cpp : 定義控制台應用程序的入口點。 // #include "stdafx.h" #include<iostream> using namespace std; #define LINE 10 struct Node{ //行號 int row; //列號 int line; //數據 int data; }; //初始化數組 int init(Node array[]) { int row,line,data; int index = 0; while(cin>>row){ if(row == -1){ break; } cin>>line>>data; array[index].data=data; array[index].line = line; array[index].row = row; index++; } return index; } //列印數組 void printArray(Node array[],int len) { for(int i = 0;i < len;i++){ cout<<array[i].row<<" "<<array[i].line<<" "<<array[i].data<<endl; } } int calc(Node a
⑥ 稀疏矩陣是怎樣存儲的
/*
稀疏矩陣的三元組順序表存儲表示
*/
# define MAX_SIZE 100//非零元個數的最大值
struct Triple
{
int i,j;//行下標,列下標
ElemType e;//非零元素值
};
struct TSMatrix
{
Triple data[MAX_SIZE+1];//非零元三元組表,data[0]未用
int mu,nu,tu;//矩陣的行數、列數和非零元個數
};
⑦ 固態硬碟每個矩陣儲存多少
對於一般線性結構的矩陣,我們採用順序存儲結構,以二維數組來存儲。
以二維數組存儲分為兩種主要形式:以行為序存儲以列為序存儲。
這樣對於一個矩陣,一旦確定了行數和列數,便可以為其分配存儲空間,反之,如果給定了矩陣中的第一個元素的存放地址(basic address),我們就可以將矩陣中元素的存儲地址表示為其下標的線性函數,這樣就可以隨機讀取或查找矩陣中的任意一個元素。比如:Loc(a ij) = Loc(a 11) + [(i-1)*n+(j-1)]*d 我們假設每個元素佔用d個單元,aij就是前面所有元素佔用的單元數加上基地址。
⑧ 設有一個 10 × 10的對稱矩陣 A採用壓縮方式進行存儲,存儲時以按行優先的順序
對稱矩陣且存儲的是下三角,那你首先得看a65是在下三角還是上三角,因為上三角的值是由下三角對稱的值來存儲的。6>5,a65在下三角。按行存儲下三角,從第一行開始分別存儲1,2,3,...個元素,a65表示第7行的第6個元素,那他前面的數據占的位元組就是(1+2+3+4+5+6+5)*2=52,所以a65的地址是下一個53
⑨ 多維數組-矩陣的壓縮存儲- 特殊矩陣(二)
三角矩陣
( )三角矩陣的劃分
以主對角線劃分 三角矩陣有上三角矩陣和下三角矩陣兩種
①上三角矩陣
如下圖(a)所示 它的下三角(不包括主角線)中的元素均為常數c
②下三角矩陣
與上三角矩陣相反 它的主對角線上方均為常數c 如下圖(b)所示
注意
在多數情況下 三角矩陣的常數c為零
( )三角矩陣的壓縮存儲
三角矩陣中的重復元素c可共享一個存儲空間 其餘的元素正好有n×(n+ )/ 個 因此 三角矩陣可壓縮存儲到向量sa[
n(n+ )/ ]中 其中c存放在向量的最後一個分量中
① 上三角矩陣中a ij 和sa[k]之間的對應關系
上三角矩陣中 主對角線之上的第p行( ≤p <n)恰有n-p個元素,按行優先順序存放上三角矩陣中的元素a 時:
a ij 元素前有i行(從第0行到第i-1行),一共有:
(n-0)+(n-1)+(n-2)+…+(n-i)=i×(2n-i+1)/2個元素;
在第i行上,a ij 之前恰有j-i個元素(即a ij ,a i,j+l ,…,a i,j-1 ),因此有:
sa[i×(2n-i+1)/2+j-i]= a ij
所以:
┌i×(2n-i+1)/2+j-i 當i≤j
k=│
└n×(n+1)/2 當i>j
②下三角矩陣中a ij 和sa[k]之間的對應關系
┌i×(i+1)/2+j 當i≥j
k=│
└n×(n+1)/2 當i <j p=""> </j>
注意:
三角矩陣的壓縮存儲結構是隨機存取結構。wIngWIt.Com
3.對角矩陣
所有的非零元素集中在以主對角線為中心的帶狀區域中,即除了主對角線和主對角線相鄰兩側的若干條對角線上的元素之外,其餘元
素皆為零的矩陣為對角矩陣。
【例】下圖給出了一個三對角矩陣。
其中:
非零元素僅出現在主對角上(a ii ,0≤i≤n-1),緊鄰主對角線上面的那條對角線上(a i , i+1 ,0≤i≤n-2)和緊鄰主對角線下
面的那條對角線上(a i+1 , i ,0≤i≤n-2)。當|i-j|>1時,元素a ij =0。
由此可知,一個k對角線矩陣(k為奇數)A是滿足下述條件的矩陣:
若|i-j|>(k-1)/2,則元素a ij =0。
對角矩陣可按行優先順序或對角線的順序,將其壓縮存儲到一個向量中,並且也能找到每個非零元素和向量下標的對應關系。具
體【參見練習】
lishixin/Article/program/sjjg/201311/23898
⑩ 有一矩陣,用C描述:int a[100][100];該矩陣按先行後列次序存儲。
這個好像是操作系統里的東西,很長時間沒看了,早忘了,但是基本原理應該是這樣的僅供參考:
A:for (i=0;i<100;i++) for (j=0;j<100;j++) a[i][j]=0;
參數會從i=0;j從0————100,數組行不變時按順序存儲,的第一行開始存儲前面100個會報缺頁,後面數字都是零,就不會報缺頁,當一個頁面存儲達到200個數字後會換頁到下一頁存儲。
B:for (j=0;j<100;j++) for (i=0;i<100;i++) a[i][j]=0;
因為是啊a[i][j]前面是j也就是數組的列在改變,而後面的i也就是行在改變,
與A不同的是當j=0;是i從0————100;也就是說數組的行在不停的改變,行改變了,存儲順序不斷發生改變,每次改變行的時候就會切換不同的頁面,所一第二種程序的缺頁次數更多。