Notice
Recent Posts
Recent Comments
Link
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
Tags
more
Archives
Today
Total
관리 메뉴

archive

[과제] sparse matrix transpose 개작 본문

C \ C++/C 스터디 예제 풀이

[과제] sparse matrix transpose 개작

안정민 2023. 4. 12. 01:50

 

<구현 소스코드>

#define _CRT_SECURE_NO_WARNINGS
#define MAX_COL 100
#include <stdio.h>
#include <stdlib.h>

typedef struct
{
	int col;
	int row;
	int value;
}term;

void fastTranspose(term a[], term b[])
{
	int rowTerms[MAX_COL], startingPos[MAX_COL];
	int i, j, numCols = a[0].col, numTerms = a[0].value; //numTerm 0이 아닌 행렬의 원소 개수

	b[0].row = numCols;
	b[0].col = a[0].row;
	b[0].value = numTerms;

	if (numTerms > 0) { //그니까 일단 0이 아닌 행렬이 존재하긴 하는 한 
		for (i = 0; i < numCols; i++)
			rowTerms[i] = 0; // 초기화

		for (i = 1; i <= numTerms; i++)
			rowTerms[a[i].col]++;

		startingPos[0] = 1;

		for (i = 1; i <= numCols; i++)
			startingPos[i] = startingPos[i - 1] + rowTerms[i - 1];

		int num=0;
		for (int i = 1; i <= numTerms; i++) {
			if (a[i].value >= 0) {
				j = startingPos[a[i].col]++;
				b[j].row = a[i].col;
				b[j].col = a[i].row;
				b[j].value = a[i].value;
				num++;
			}
			else {
				rowTerms[a[i].col]--;
				for (int k = a[i].col; k <= numTerms; k++) {
					startingPos[k]--;
				}
				

			}
				
		}
		b[0].value = num;
	}
}

int main(void) {
	int i, j;
	term A[9] = { {6,6,8}, {0,0,15}, {0,3,22}, {0,5,-15}, {1,1,11}, {1,2,3}, {2,3,-6}, {4,0,91}, {5,2,28} };
	term B[9];

	printf("행의 수: %d, 열의 수: %d, 0이 아닌 항의 수: %d\n", A[0].row, A[0].col, A[0].value);

	for (i = 1; i < 9; i++)
		printf("행: %d, 열: %d, 값: %d\n", A[i].row, A[i].col, A[i].value);
	printf("\n\n");

	fastTranspose(A, B);

	printf("Transpose processing has been finished.\n");
	printf("\n\n");

	printf("행의 수: %d, 열의 수: %d, 0이 아닌 항의 수: %d\n", B[0].row, B[0].col, B[0].value);

	for (i = 1; i <= B[0].value; i++)
		printf("행: %d, 열: %d, 값: %d\n", B[i].row, B[i].col, B[i].value);
	printf("\n\n");



	return 0;
}

<실행결과>