1. 程式人生 > >矩陣的壓縮儲存————用三元組表儲存稀疏矩陣

矩陣的壓縮儲存————用三元組表儲存稀疏矩陣

所謂壓縮儲存,是指對多個值相同的元素只分配一個空間,對零元素不分配空間。

一、特殊矩陣

特殊矩陣是指值相同的元素分佈具有一定規律的矩陣,如對角矩陣、三角矩陣,對稱矩陣等,對於此類矩陣,找到一個關係將其元素儲存到一維陣列中,通過這個關係可以對矩陣中的元素進行隨機存取。

二、稀疏矩陣

稀疏矩陣中也含有較多的零元素,但是非零元素的分佈沒有任何規律,因此在儲存非零元素的同時,還必須儲存適當的輔助資訊,才能迅速確定一個非零元素是矩陣中的哪一個元素。稀疏矩陣的表示有很多種方法,下面僅分析用三元組表示稀疏矩陣儲存的方法。
矩陣中非零元素的行號、列號及元素值組成了三元組,三元組按行優先(或列優先)的順序排列得到一個其結點均是三元組的線性表,此外,要唯一的確定一個稀疏矩陣,還必須確定矩陣的行數和列數,為了方便,還要將非零元素個數儲存起來,於是得到稀疏矩陣的一種型別如下:

#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