[Raspberry_PI]_Implementation of Sparse Matrix Transposition Using Structures
juniha2025. 6. 25. 19:26
목적
희소 행렬을 (행, 열, 값) 형태로 구성된 구조체 배열로 표현함으로써, 0이 아닌 원소만을 효율적으로 저장하고, 이를 기반으로 전치 연산을 수행하여 메모리 절약과 구조체 기반 데이터 처리 방법 확인
C 언어의 구조체를 활용하여 희소 행렬(Sparse Matrix)의 전치 연산(transpose)**을 구현하는 것을 목적
환경
Raspberrypi 3B, 64bit, 6.12, y-ssh로 접속
Matrix 사용 코드
#include <stdio.h>
#include <stdlib.h>
#define MAX_TERMS 100 // 저장할 수 있는 최대 비영(非零, 0이 아닌) 항의 개수
// 희소 행렬의 하나의 항을 표현하는 구조체
typedef struct {
int row; // 행 인덱스
int col; // 열 인덱스
int val; // 실제 값 (0이 아닌 값만 저장)
} element;
// 전체 희소 행렬을 표현하는 구조체
typedef struct {
element data[MAX_TERMS]; // 0이 아닌 항들만 저장하는 배열
int rows; // 전체 행의 수
int cols; // 전체 열의 수
int terms; // 0이 아닌 항의 총 개수
} SparseMatrix;
// 희소 행렬의 전치(transpose)를 수행하는 함수
SparseMatrix matrix_transpose2(SparseMatrix a) {
SparseMatrix b; // 전치 결과를 저장할 행렬
int bindex = 0; // 결과 행렬 b에 값을 넣기 위한 인덱스
// 전치 시 행과 열이 바뀜
b.rows = a.cols;
b.cols = a.rows;
b.terms = a.terms;
// 항이 있을 경우에만 수행
if(a.terms > 0) {
// 열(column) 기준으로 정렬된 전치를 수행
for(int c = 0; c < a.cols; c++) {
for(int i = 0; i < a.terms; i++) {
// 현재 항의 열이 c와 일치하는 항만 선택
if(a.data[i].col == c) {
// 전치: 행과 열을 바꾸어서 저장
b.data[bindex].row = a.data[i].col;
b.data[bindex].col = a.data[i].row;
b.data[bindex].val = a.data[i].val;
bindex++; // 다음 위치로 이동
}
}
}
}
return b; // 전치된 행렬 반환
}
// 희소 행렬을 (row, col, val) 형식으로 출력하는 함수
void matrix_print(SparseMatrix a) {
printf("=====================\n");
for(int i = 0; i < a.terms; i++)
printf("(%d, %d, %d) \n", a.data[i].row, a.data[i].col, a.data[i].val);
printf("=====================\n");
}
int main(void) {
// 초기 희소 행렬 정의: 6x6 행렬에 7개의 0이 아닌 항이 존재
SparseMatrix m = {
{ // data 배열: (row, col, val)
{0, 3, 7},
{1, 0, 9},
{1, 5, 8},
{3, 0, 6},
{3, 1, 5},
{4, 5, 1},
{5, 2, 2}
},
6, 6, 7 // 총 행 수, 열 수, 항 개수
};
SparseMatrix result;
// 희소 행렬 전치 수행
result = matrix_transpose2(m);
// 결과 출력
matrix_print(result);
return 0;
}