国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【數據結構】數組和字符串(二):特殊矩陣的壓縮存儲:對角矩陣——一維數組

這篇具有很好參考價值的文章主要介紹了【數據結構】數組和字符串(二):特殊矩陣的壓縮存儲:對角矩陣——一維數組。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

4.2.1 矩陣的數組表示

【數據結構】數組和字符串(一):矩陣的數組表示

4.2.2 特殊矩陣的壓縮存儲

??矩陣是以按行優(yōu)先次序將所有矩陣元素存放在一個一維數組中。但是對于特殊矩陣,如對稱矩陣、三角矩陣、對角矩陣和稀疏矩陣等, 如果用這種方式存儲,會出現大量存儲空間存放重復信息或零元素的情況,這樣會造成很大的空間浪費。為節(jié)約存儲空間和算法(程序)運行時間,通常會采用壓縮存儲的方法。

  • 對角矩陣:指除了主對角線以外的元素都為零的矩陣,即對 任意 i ≠ j (1≤ i , j ≤n),都有M(i, j)=0。由于只有主對角線上有非零元素,只需存儲主對角線上的元素即可。
  • 三角矩陣:指上三角或下三角的元素都為零的矩陣。同樣地,只需存儲其中一部分非零元素,可以節(jié)省存儲空間。
  • 對稱矩陣:指矩陣中的元素關于主對角線對稱的矩陣。由于對稱矩陣的非零元素有一定的規(guī)律,可以只存儲其中一部分元素,從而減少存儲空間。
  • 稀疏矩陣:指大部分元素為零的矩陣。傳統(tǒng)的按行優(yōu)先次序存儲方法會浪費大量空間來存儲零元素,因此采用壓縮存儲的方法更為合適。常見的壓縮存儲方法有:壓縮稠密行(CSR)、壓縮稠密列(CSC)、坐標列表(COO)等。

a. 對角矩陣的壓縮存儲

??對于一個n×n維的對角矩陣M,由于非主對角線上的元素都為零,只需存儲其n個對角元素的值即可。可以使用一維數組d[n]來壓縮存儲對角矩陣,其中d[i-1] (1≤ i ≤ n)存儲M(i, i)的值。這種壓縮存儲方式可以顯著減少存儲空間的使用量,尤其在矩陣規(guī)模較大時效果更為明顯。同時,在對角矩陣的運算中,由于非主對角線上的元素都為零,可以通過直接訪問壓縮后的數據來提高算法的效率。

結構體

typedef struct {
    int size;       // 矩陣的維度
    int diagonal[MAX_SIZE];  // 存儲對角元素的數組
} DiagonalMatrix;

?? DiagonalMatrix 結構體定義了對角矩陣的結構,包括矩陣的維度 size 和存儲對角元素的數組 diagonal。

初始化

void initialize(DiagonalMatrix *matrix, int size) {
    matrix->size = size;

    // 初始化對角元素數組
    for (int i = 0; i < size; i++) {
        matrix->diagonal[i] = 0;
    }
}

??initialize 函數用于初始化對角矩陣,接受一個指向 DiagonalMatrix 結構體的指針和矩陣的維度作為參數,在函數內部將矩陣的維度存儲到 size 成員變量中,并將對角元素數組的所有元素初始化為0。

元素設置

void setElement(DiagonalMatrix *matrix, int row, int col, int value) {
    if (row != col) {
        printf("Error: Only diagonal elements can be set.\n");
    } else if (row < 0 || row >= matrix->size || col < 0 || col >= matrix->size) {
        printf("Error: Invalid row or column index.\n");
    } else {
        matrix->diagonal[row] = value;
    }
}

??setElement 函數用于設置對角矩陣中指定位置的元素值,接受一個指向 DiagonalMatrix 結構體的指針、行索引、列索引和要設置的值作為參數。

  • 函數首先檢查行索引和列索引是否相等,因為只有對角線上的元素可以被設置。
  • 檢查行索引和列索引是否有效,即在矩陣范圍內。
  • 如果通過了檢查,將指定位置的對角元素設置為給定的值。

元素獲取

int getElement(DiagonalMatrix *matrix, int row, int col) {
    if (row < 0 || row >= matrix->size || col < 0 || col >= matrix->size) {
        printf("Error: Invalid row or column index.\n");
        return 0;
    } else if (row != col) {
        return 0;
    } else {
        return matrix->diagonal[row];
    }
}

??getElement 函數用于獲取對角矩陣中指定位置的元素值,接受一個指向 DiagonalMatrix 結構體的指針、行索引和列索引作為參數。

  • 函數首先檢查行索引和列索引是否有效,如果無效則打印錯誤信息并返回0。、
  • 然后再次檢查行索引和列索引是否相等,如果不相等則表示該位置不是對角元素,返回0。
  • 如果通過了檢查,返回指定位置的對角元素的值。

打印矩陣

void printMatrix(DiagonalMatrix *matrix) {
    for (int i = 0; i < matrix->size; i++) {
        for (int j = 0; j < matrix->size; j++) {
            printf("%d ", getElement(matrix,i,j));
        }
        printf("\n");
    }
}

??printMatrix 函數用于打印對角矩陣,接受一個指向 DiagonalMatrix 結構體的指針作為參數。函數通過兩層循環(huán)遍歷矩陣的每個位置,調用getElement 函數獲取并打印元素的值。

主函數

int main() {
    DiagonalMatrix matrix;
    int size = 6;

    initialize(&matrix, size);
    // 讀入數據并設置對角矩陣的元素
    for (int i = 0; i < size; i++) {
        int value;
        printf("\nEnter the value for element [%d][%d]: ", i, i);
        scanf("%d", &value);
        setElement(&matrix, i, i, value);
    }

    printf("Diagonal Matrix:\n");
    printMatrix(&matrix);
    return 0;
}

??在 main 函數中,首先定義了一個 DiagonalMatrix 類型的變量 matrix 和一個整數變量 size。然后調用 initialize 函數初始化矩陣,將矩陣的維度設置為4,并將對角元素分別設置為1、2、3和4。最后使用 printMatrix 函數打印矩陣。

輸出結果

【數據結構】數組和字符串(二):特殊矩陣的壓縮存儲:對角矩陣——一維數組,數據結構,數據結構,矩陣,線性代數,1024程序員節(jié)文章來源地址http://www.zghlxwxcb.cn/news/detail-720265.html

代碼整合

#include <stdio.h>

#define MAX_SIZE 100

// 定義對角矩陣結構體
typedef struct {
    int size;       // 矩陣的維度
    int diagonal[MAX_SIZE];  // 存儲對角元素的數組
} DiagonalMatrix;

// 初始化對角矩陣
void initialize(DiagonalMatrix *matrix, int size) {
    matrix->size = size;

    // 初始化對角元素數組
    for (int i = 0; i < size; i++) {
        matrix->diagonal[i] = 0;
    }
}

// 設置對角矩陣中指定位置的元素值
void setElement(DiagonalMatrix *matrix, int row, int col, int value) {
    if (row != col) {
        printf("Error: Only diagonal elements can be set.\n");
    } else if (row < 0 || row >= matrix->size || col < 0 || col >= matrix->size) {
        printf("Error: Invalid row or column index.\n");
    } else {
        matrix->diagonal[row] = value;
    }
}

// 獲取對角矩陣中指定位置的元素值
int getElement(DiagonalMatrix *matrix, int row, int col) {
    if (row < 0 || row >= matrix->size || col < 0 || col >= matrix->size) {
        printf("Error: Invalid row or column index.\n");
        return 0;
    } else if (row != col) {
        return 0;
    } else {
        return matrix->diagonal[row];
    }
}

// 打印對角矩陣
void printMatrix(DiagonalMatrix *matrix) {
    for (int i = 0; i < matrix->size; i++) {
        for (int j = 0; j < matrix->size; j++) {
            printf("%d ", getElement(matrix,i,j));
        }
        printf("\n");
    }
}

int main() {
    DiagonalMatrix matrix;
    int size = 6;

    initialize(&matrix, size);
    // 讀入數據并設置對角矩陣的元素
    for (int i = 0; i < size; i++) {
        int value;
        printf("\nEnter the value for element [%d][%d]: ", i, i);
        scanf("%d", &value);
        setElement(&matrix, i, i, value);
    }

    printf("Diagonal Matrix:\n");
    printMatrix(&matrix);
    return 0;
}

到了這里,關于【數據結構】數組和字符串(二):特殊矩陣的壓縮存儲:對角矩陣——一維數組的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包