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
函數打印矩陣。文章來源:http://www.zghlxwxcb.cn/news/detail-720265.html
輸出結果
文章來源地址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模板網!