矩陣的壓縮儲存————用三元組表儲存稀疏矩陣
所謂壓縮儲存,是指對多個值相同的元素只分配一個空間,對零元素不分配空間。
一、特殊矩陣
特殊矩陣是指值相同的元素分佈具有一定規律的矩陣,如對角矩陣、三角矩陣,對稱矩陣等,對於此類矩陣,找到一個關係將其元素儲存到一維陣列中,通過這個關係可以對矩陣中的元素進行隨機存取。
二、稀疏矩陣
稀疏矩陣中也含有較多的零元素,但是非零元素的分佈沒有任何規律,因此在儲存非零元素的同時,還必須儲存適當的輔助資訊,才能迅速確定一個非零元素是矩陣中的哪一個元素。稀疏矩陣的表示有很多種方法,下面僅分析用三元組表示稀疏矩陣儲存的方法。
矩陣中非零元素的行號、列號及元素值組成了三元組,三元組按行優先(或列優先)的順序排列得到一個其結點均是三元組的線性表,此外,要唯一的確定一個稀疏矩陣,還必須確定矩陣的行數和列數,為了方便,還要將非零元素個數儲存起來,於是得到稀疏矩陣的一種型別如下:
#define MAX 12
typedef int datatype;
typedef struct
{
int i, j; //行號、列號
datatype v; //元素值
} node;
typedef struct
{
int m, n, t; //行數,列數,非零元素個數
node data[MAX]; //三元組表
}spmatrix;
三、演算法分析舉例
下面以矩陣的轉置簡單說明一下如何用稀疏矩陣進行矩陣運算:
將矩陣A轉置為B,即B[i][j] = A[j][i],這樣看來,其實只需將三元組中的i與j 數值交換即可,但是這樣做,轉置後的矩陣就不會按照行優先或列優先的順序線上性表中排列了。由於A的列是B的行,因此按A的列順序進行轉置,得到的轉置矩陣B必然是按行排列的,具體演算法描述如下:
spmatrix *TransMat(spmatrix *a) //稀疏矩陣的轉置
{
int p, q, bno = 0;
spmatrix *b;
b = (spmatrix *)malloc(sizeof(spmatrix)); //為矩陣b分配記憶體空間
b->m = a->n;
b->n = a->m;
b->t = 0;
if (a->t == 0) //若b中元素全為零,則將b返回
return b;
for (p = 0; p < a->n; p++)
for (q = 0 ; q < a->t; q++)
if (a->data[q].j == p)
{
b->data[bno].i = a->data[q].j;
b->data[bno].j = a->data[q].i;
b->data[bno].v = a->data[q].v;
bno++;
}
b->t = bno;
return b;
}
上述演算法有雙重迴圈,若A有n列t個非零元素,則演算法複雜度為O(n x t),若用二維矩陣儲存,A有m行n列,則演算法複雜度為O(n x m),一般t遠大於m,因此在此例中,稀疏矩陣轉置演算法執行時間更長一些。
四、完整程式舉例
下面寫一個完成的C程式來測試稀疏矩陣三元組結構及轉置演算法,程式輸入為一個3行4列的整數矩陣,輸出轉置矩陣。
/* 稀疏矩陣的型別說明及轉置演算法 */
#include<stdio.h>
#include<stdlib.h>
#define MAX 12
typedef int datatype;
typedef struct
{
int i, j; //行號、列號
datatype v; //元素值
} node;
typedef struct
{
int m, n, t; //行數,列數,非零元素個數
node data[MAX]; //三元組表
}spmatrix;
spmatrix *Create(); //建立一個3行4列的稀疏矩陣
spmatrix *TransMat(spmatrix *a); //稀疏矩陣的轉置
void Output(spmatrix *a); //在螢幕上以行列的形式輸出矩陣
int main()
{
spmatrix *a = Create();
spmatrix *b = TransMat(a);
printf("原矩陣:\n");
Output(a);
printf("轉置矩陣:\n");
Output(b);
return 0;
}
spmatrix *Create() //建立一個3行4列的稀疏矩陣
{
int m = 3, n = 4, k = 0, t = 0;
datatype element;
spmatrix *matrix;
matrix = (spmatrix *)malloc(sizeof(spmatrix)); //建立一個稀疏矩陣a
matrix->m = m;
matrix->n = n;
printf("輸入12個整數:\n");
while (k < m*n)
{
scanf_s("%d", &element);
if (element != 0)
{
matrix->data[t].i = k / n;
matrix->data[t].j = k % n;
matrix->data[t].v = element;
t++;
}
k++;
}
matrix->t = t;
return matrix;
}
spmatrix *TransMat(spmatrix *a) //稀疏矩陣的轉置
{
int p, q, bno = 0;
spmatrix *b;
b = (spmatrix *)malloc(sizeof(spmatrix)); //為矩陣b分配記憶體空間
b->m = a->n;
b->n = a->m;
b->t = 0;
if (a->t == 0) //若b中元素全為零,則將b返回
return b;
for (p = 0; p < a->n; p++)
for (q = 0; q < a->t; q++)
if (a->data[q].j == p)
{
b->data[bno].i = a->data[q].j;
b->data[bno].j = a->data[q].i;
b->data[bno].v = a->data[q].v;
bno++;
}
b->t = bno;
return b;
}
void Output(spmatrix *a)
//輸入:稀疏矩陣、行數,列數
//輸出:在螢幕上以行列的形式輸出矩陣
{
int i = 0, j = 0, k = 0;
for (i = 0; i < a->m; i++)
{
for (j = 0; j < a->n; j++)
{
if (i == a->data[k].i && j == a->data[k].j)
{
printf("%d ", a->data[k].v);
k++;
}
else
printf("%d ", 0);
}
printf("\n");
}
}
相關推薦
矩陣的壓縮儲存————用三元組表儲存稀疏矩陣
所謂壓縮儲存,是指對多個值相同的元素只分配一個空間,對零元素不分配空間。 一、特殊矩陣 特殊矩陣是指值相同的元素分佈具有一定規律的矩陣,如對角矩陣、三角矩陣,對稱矩陣等,對於此類矩陣,找到一個關係將其元素儲存到一維陣列中,通過這個關係可以對矩陣中的元素進行隨
稀疏矩陣的三元組表儲存 C語言
#include <stdio.h> #define MaxSize 100 typedef int DataType; typedef struct { DataType v; int i, j; }TriTupleNode; typedef s
利用稀疏矩陣的“三元組表”儲存結構,實現兩個矩陣的相加。
#include<iostream> #include<conio.h> #include<iomanip> using namespace std; const int MAXSIZE = 50; typedef int ElemTyp
資料結構-稀疏矩陣-靜態分配的三元組順序儲存
假設在m*n的矩陣中,有t個元素不為0,令a=t/m*n 稱a為矩陣的稀疏因子。通常認為 a<= 0.05時稱為稀疏矩陣。 按照壓縮儲存的概念,只儲存稀疏矩陣的非零元。因此,除了儲存非零元的值之外,還必須同時幾下它所在行和列的位置(i,j)。反之 一個三元組(i,j
三元組轉置稀疏矩陣
當一個矩陣中非零元素遠小於矩陣中元素的個數時,如果用簡單的二維陣列來表示矩陣就會造成大量的空間佔用, 所以引進三元組來表示稀疏矩陣。 如下: typedef struct{ int i , j;//表示非零元素的行列 int v;//矩陣的非零元素 }SPNode
三元組表示的稀疏矩陣的加法和乘法
#include <stdio.h> #include <stdlib.h> //函式結果狀態碼 #define OK 1 #define ERROR 0 #define OVERFLOW -1 //Status是函式的型別,
矩陣相加的演算法(儲存結構為三元組表)
假設稀疏矩陣A和B均以三元組表作為儲存結構。試寫出矩陣相加的演算法,另設三元組表C存放結果矩陣。 稀疏矩陣的三元組順序表型別TSMatrix的定義: #define MAXSIZE 20 // 非零元個數的最大值 typedef struct { int i,j;
用三元組儲存稀疏矩陣並實現轉置
基本概念 在學習線性代數的時候,經常用到矩陣。在C語言中,表示矩陣的最直觀形式就是二維陣列。然而在實際應用中,很多高階矩陣中的非零元素非常少,這個時候如果繼續使用二維陣列儲存,那麼就會浪費很多儲存空間。 在資料結構中,我們用三元組儲存稀疏矩陣。三元組定義為(i,v,j),這
(13)稀疏矩陣的壓縮-三元組表(轉置)
若矩陣中的非零元素遠遠小於矩陣元素的個數,且分佈沒有規律,則稱這個矩陣為稀疏矩陣。 壓縮儲存是指對多個值相同的元素只分配一個儲存空間,對零元素不分配空間。 稀疏矩陣的壓縮儲存有兩種方法:三元組的順序儲存(三元組表)和鏈式儲存(十字連結串列)。 現在主要講三元組表,由於兩個階
稀疏矩陣的實現(三元組儲存)C++
通過三元組儲存稀疏矩陣,壓縮儲存空間 /* 稀疏矩陣的實現 */ #include<iostream> #include<fstream> #include<string> using namespace std; //儲存域 const
Fortran:用csr儲存格式並使用pardiso求解稀疏矩陣
!// 利用連結串列儲存稀疏矩陣 Program CSR Integer, parameter :: m = 5, n = 5 !// depend on your data Integer :: i, j, mm, tmp, nn, fileid, first, num Real(k
矩陣三元組表
這裡講的矩陣三元組表有建立矩陣三元組表,求三元組表的轉置矩陣,三元組表矩陣相乘,輸出三元組表矩陣。 #include <stdio.h> #include<stdlib.h>#define OK 1#define ERROR 0#define TRUE 1
三元組順序表,稀疏矩陣的三元組表示法
三元組順序表,用於稀疏矩陣的儲存,因此經常被稱為係數矩陣的三元組表示,它們是一個意思。 稀疏矩陣,即包含大量值為 0 的矩陣,此類矩陣的一種儲存方法是將矩陣中所有非 0 元素所在的位置(行標和列標)和元素值儲存在順序表(陣列)中,通過儲存由所有非 0 元素的三元組構成的順序表,以及該稀疏矩陣的行數和列數,即
稀疏矩陣的加法(用十字鏈表實現A=A+B)
稀疏矩陣 track ack _id eat dsm sca post 三元 描寫敘述: 輸入兩個稀疏矩陣A和B,用十字鏈表實現A=A+B,輸出它們相加的結果。 輸入: 第一行輸入四個正整數,各自是兩個矩陣的行m、列n、第一個矩陣的非零元素
【MySQL技術內幕:InnoDB儲存引擎】MySQL表儲存引擎
目錄 InnoDB儲存引擎 MyISAM儲存引擎 NDB儲存引擎 Memory儲存引擎 Archive 儲存引擎 Federated儲存引擎 Maria儲存引擎 其它儲存引擎 InnoDB儲存引擎
矩陣的壓縮儲存(稀疏矩陣的十字連結串列儲存、稀疏矩陣的三元組行邏輯連結的順序表儲存表示、稀疏矩陣的三元組順序表儲存表示)
// c5-2.h 稀疏矩陣的三元組順序表儲存表示(見圖5.4) #define MAX_SIZE 100 // 非零元個數的最大值 struct Triple { int i,j; // 行下標,列下標 ElemType e; // 非零元素值 }; struct T
(重新放入原始碼)稀疏矩陣壓縮儲存及轉置,加法運算(採用三元表)
一、 實驗環境VC6.0, 二、 實驗目的 輸入任意兩個稀疏矩陣進入三元表,求出其加法運算後的矩陣,轉置矩陣,輸出矩陣。 三、 實驗內容1用C語言實現稀疏矩陣的三元組儲存結構 ;2實現稀疏矩陣的矩陣輸入、矩陣輸出等演算法;3.利用三元組儲存結構解決稀疏矩陣的運算問題(
稀疏矩陣的三元組表示的實現及應用(2)——採用三元組儲存稀疏矩陣,設計兩個稀疏矩陣相加的運算演算法
/* *Copyright (c) 2015 , 煙臺大學計算機學院 *All right resvered . *檔名稱: 稀疏矩陣.cpp *作 者: 鄭兆涵 *稀疏矩陣的三元組表示的實現及應用(2) */ 問題:稀疏矩
稀疏矩陣的三元組儲存
稀疏矩陣是一種特殊矩陣,其非0元素的個數遠遠小於0元素的個數。稀疏矩陣是針對稠密矩陣而言的。 為了節省儲存空間,我們很容易地想到只保矩陣中極少數的非0元素就可以,而零元素不予考慮,進而可以想到
順序儲存的稀疏矩陣(三元組)的轉置
#define MAXSIZE 12500 typedef struct { int i, j; //行i,列j ElemType e; }Triple; typedef