컴퓨터 개론 및 실습 강의 9.

Slides:



Advertisements
Similar presentations
구조체 : Structure 와 포인터 2. 집합적 변수 생성 가능 structure_declaration ::= struct_specifier declarator_list ; struct_specifier ::= struct tag_name | struct tag_name.
Advertisements

2009학년도 가톨릭대학교 입학안내.
남북 탑승객 150명을 태운 디젤기관차가 2007년 5월 17일 오전 경의선 철길을 따라 남측 최북단 역인 도라산역 인근 통문을 통과하고 있다. /문산=사진공동취재단.
화장품 CGMP 한국콜마㈜.
UV Sterilizer 냉온 정수기를 위한 UV살균기
임방울의 출생과 성장 - 출생에서 전국명창대회 입상하기까지 - 임방울의 후원자 2 지 춘 상(전남대학교 명예교수)
-모둠원- 정미영, 임수윤, 한정혜, 손세빈, 최수호
가보고 싶은 나라 프랑스 백운초등학교 6-2 이수현.
소공동체 의 활동과 선교.
Light field camera and its applications
다산(茶山) 정약용[丁若鏞] 조선 후기의 실학자 태어난 때: 1762(영조 38), 죽은 때: 1836(헌종 2)
한국 전통 놀이 정 용 용
유전 알고리즘 (Genetic Algorithm)
일시 : 2013년 7월 7일(일) 장소 : 진선여자중학교 서울시 강남구 선릉로 85길(역삼2동 713)
소비조합 설문조사 결과.
Computer Network Lab. Keimyung University
성덕대왕 신종(771년) 만든이:설승원 출처:네이버.
사진에 기대어 詩를 보다 현대시 100주년 기념 초대전
8월 정기모임 일 시 : ~9.1(토, 일 1박2일) 장 소 : 강원도 인제군 기린면 북리2
강의 중반부 시연.
绪论 第一节 自然条件对中国古代建筑的影响 第二节 中国古代建筑发展的几个阶段 第三节 中国古代建筑的特点 第一章 第一节 原始人群的住所 第二节 仰韶文化的建筑遗迹 第三节 龙山文化的建筑遗迹 第二章 (公元前21世纪—前476年) 第一节 夏——中国奴隶制国家的诞生 第二节 商朝的宫室和陵墓 第三节.
전략산학 2기 발표 평가회 DRAM Capacitor 유전막 기술 황철성 교수님
Emphysematous Pyelonephritis
Adaptive Boost (AdaBoost)
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
배열(Array) 선린인터넷고등학교 정보통신과 유 순 옥.
3 순차 자료구조와 선형 리스트.
1월 1일은 무슨 날일까? 설날!!.
정진항 : 대한민국憲法 (韓南大學校 교양) 정진항 :
C로 쉽게 풀어쓴 자료구조 © Copyright 생능출판사 2011
C로 쉽게 풀어쓴 자료구조 © Copyright 생능출판사 2005
제 2 장 배열과 스트링.
Chapter 03 배열, 구조체, 포인터.
C언어: 배열 (Arrays).
쉽게 풀어쓴 C언어 Express 제16장 파일 입출력 C Express Slide 1 (of 23)
CHAP 3:배열, 구조체, 포인터.
제 3 장. 배열과 구조체 및 포인터.
HW#2 #1과 동일한 방법으로 argc와 argv를 사용함
10장 메모리 관리.
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express.
25장. 메모리 관리와 동적 할당.
동적메모리와 연결리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
C 프로그래밍.
7장 배열 배열의 정의 배열의 초기화 1차원 배열 2차원 및 다차원 배열 문자 배열 배열과 구조.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express.
프로그래밍실습 제 17 강.
석가모니의 탄생 1 모둠 강화영.
프로그래밍실습 제 16 강.
동적 계획(Dynamic Programming)
11장. 1차원 배열 IT응용시스템공학과 김 형 진 교수.
제 3 장 연산자 (Operators).
4장 - PHP의 표현식과 흐름 제어-.
게임프로그래밍 I - 1차원 배열 - 공주대학교 게임디자인학과 박 찬 교수 2011년 4월 25일.
Chapter 11. 배열과 포인터.
#1 배열 활용 #include int main(void) { int i; int grade[5]; grade[0] = 10; grade[1] = 20; grade[2] = 30; grade[3] = 40; grade[4] = 50; for(i=0;i.
6장 반복제어문 for 문 while 문 do while 문 기타 제어문.
동적계획법과 최적화 문제 Dynamic Programming을 사용한 최적화 문제를 해결하는 알고리즘 설계 절차
-Part1- 제7장 반복문이란 무엇인가.
adopted from KNK C Programming : A Modern Approach
1-6.
토론을 위한 질문 배열의 이름에는 무엇이 저장되는가? C언어에서 배열 추상데이터의 store는 어떻게 구현 되는가?
용이 여자에게 분노하여 돌아가서 5-1 그 여자의 남은 자손 곧 하나님의 계명을 지키며
DP 기반 최단경로 – 자료 구조 및 전략 (1/4) 주어진 그래프에 대한 W:인접행렬(adjacent matrix) 표현 W
이산수학(Discrete Mathematics)
-Part2- 제2장 다차원 배열이란 무엇인가.
9주차: Using Files and Others
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
C 프로그래밍은 매우 도전적인 작업이다. 도전의 이면에 철저한 준비와 체계적인 노력
11장. 1차원 배열.
Presentation transcript:

컴퓨터 개론 및 실습 강의 9

행렬의 column-major 및 1차원 처리 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ C 언어에서 행렬 int A[2][4] = { 1,2,3,4,5,6,7,8 }은 row-major 로 세팅되어 있으므로 i행 j열 원소는 A[i][j]로 처리된다. A = [ 1 2 3 4 ] [ 5 6 7 8 ] A[0] = [ 1 2 3 4 ] A[1] = [ 5 6 7 8 ]

행렬의 column-major 및 1차원 처리 ■ 1차원 배열과 행렬 아래에 주어진 1차원 배열 A, B 를 4 x 2 행렬에 column-major 로 초기화시키는 방법으로 대응시키고 싶다. 그러나, C 언어에서 행렬은 row-major 로 처리되므로 사용자가 이러한 직접 처리를 고안해야 한다. 따라서 m x n 행렬에 대한 일반적인 포인터를 고안해보자. 2차원 배열 포인터를 이용하면 i 행 j 열 원소를 사용자가 고안한 함수를 이용하여 *prow [ i ] [ j ] (행-우선) 및 *pcol [ j ] [ i ] (열-우선) 두 가지 방법 모두 가능하게 처리할 수 있다. double A[] = { 1,2,3,4, 5,6,7,8 }; double B[] = {2,3,4,5, 6,7,8,1 }; A = [ 1 5 ] [ 2 6 ] [ 3 7 ] [ 4 8 ] B = [ 2 6 ] [ 5 1 ]

행렬의 column-major 및 1차원 처리 (cont.) void mulAtrB(double*C, int m1,int n1, double*A, int m2,int n2, double*B) { // m1 x n1 matrix A // m2 x n2 matrix B // C = A' * B, n1 x n2 matrix int i,j,k; double *a,*b; if( m1 != m2 ) { printf(“mulAtrB : inner dimension mismatch\n"); exit(1); } b = B; for(j = 0; j < n2; j++) { a = A; for(i = 0; i < n1; i++) { *C = 0; for(k = 0; k < m1; k++) *C += a[k] * b[k] ; a += m1; ++C; } b += m1; double A[] = { 1,2,3,4, 5,6,7,8 }; double B[] = { 2,3,4,5, 6,7,8,1 }; double C[100]; mulAtrB(C, 4,2,A, 4,2,B); b a [ 1 2 3 4 ] [ 5 6 7 8 ] [ 2 6 ] [ 3 7 ] [ 4 8 ] [ 5 1 ] [ 40 48 ] [ 96 136 ]

행렬의 column-major 및 1차원 처리 (cont.) double ***rowmtrx(int m,int n) { int i,j,k; double ***A, *pnull = NULL; // pointers to rows A = (double ***) malloc((size_t) (m*sizeof(double **))); if(A == NULL) { printf("allocation failure in matrix"); exit(1); } A[0] = (double **) malloc((size_t)(m*n*sizeof(double*))); for(i = 1; i < m; i++) A[i] = A[i-1]+n; for(i = 0; i < m; i++) for(j = 0; j < n; j++) A[i][j] = pnull+i + m*j; // i,j return A; // pointer to array of pointers to rows } 위에서 A[0] = (double **) malloc( (size_t) (m * n * sizeof(double*)) ); 인 명령에서 double 형 데이터에 대한 m*n 개의 포인터를 정의하였다. 따라서, m*n 개의 원소에 대한 1차원 처리 가능하다. 한편, A[0] 다음의 포인터 A[1]은 n 개의 double 형 데이터를 가리킨다. double M[] = { 1,2,3,4, 5,6,7,8 }; prow[0] prow[1] prow[2] prow[3] [ 1 5 ] [ 2 6 ] [ 3 7 ] [ 4 8 ] row-major m = 4 n = 2

행렬의 column-major 및 1차원 처리 (cont.) double ***colmtrx(int m,int n) { int i,j,k; double ***A, *pnull = NULL; // pointers to rows A = (double ***) malloc((size_t) (m*sizeof(double **))); if(A == NULL) { printf("allocation failure in matrix"); exit(1); } A[0] = (double **) malloc((size_t)(m*n*sizeof(double*))); for(j = 1; j < n; j++) A[j] = A[j-1]+m; for(i = 0; i < m; i++) for(j = 0; j < n; j++) A[j][i] = pnull+i + m*j; // j,i return A; // pointer to array of pointers to rows } double M[] = { 1,2,3,4, 5,6,7,8 }; pcol[0] pcol[1] column-major m = 2 n = 4 prow[0] prow[1] prow[2] prow[3] [ 1 5 ] [ 2 6 ] [ 3 7 ] [ 4 8 ] [ 1 5 ] [ 2 6 ] [ 3 7 ] [ 4 8 ] row-major m = 4 n = 2 6

행렬의 column-major 및 1차원 처리 (cont.) int i,j, m,n; double A[] = { 1,2,3,4, 5,6,7,8 }; double ***pcol,***prow; m = 4; n = 2; prow = rowmtrx(m,n); // row-major pcol = colmtrx(m,n); // column-major for(i=0;i<m;i++) for(j=0;j<n;j++) printf(" %g", *( (A-NULL)+prow[i][j]) ); printf("\n"); // A[i][j] for(j=0;j<n;j++) for(i=0;i<m;i++) printf(" %g", *( (A-NULL)+pcol[j][i]) ); printf("\n"); // A[j][i] 위와 같이 행우선, 열우선 포인터를 각각 정의할 수 있다. 결과는 double A[100] = { 1,2,3,4, 5,6,7,8 }; A = [ 1 5 ] [ 2 6 ] [ 3 7 ] [ 4 8 ] 1 5 2 6 3 7 4 8 1 2 3 4 5 6 7 8 pcol[0] pcol[1] column-major m = 2 n = 4 prow[0] prow[1] prow[2] prow[3] [ 1 5 ] [ 2 6 ] [ 3 7 ] [ 4 8 ] [ 1 5 ] [ 2 6 ] [ 3 7 ] [ 4 8 ] row-major m = 4 n = 2

행렬의 column-major 및 1차원 처리 (cont.) void mulAB(double *C, double *A, double *B, double ***prow, double ***pcol, int n) { // C = A * B, n x n matrix int i,j,k; double **a,**b; b = pcol[0]; for(j = 0; j < n; j++) { a = prow[0]; for(i = 0; i < n; i++) { *C = 0; for(k = 0; k < n; k++) *C += *(a[k]+(A-NULL)) * *(b[k]+(B-NULL)); ++C; a += n; } b += n; a[k] + A 는 에러인 이유는 두 개의 포인터를 더할 수 없기 때문이다. 포인터 NULL 의 주소값은 0 이므로 (A-NULL)은 두 개의 포인터의 차이로 정수값이 되므로 포인터에 더할 수 있게 된다. double X[] = { 1,2,3,4 }; double Y[] = { 5,6,7,8 }; double C[100]; [ 1 3 ] [ 2 4 ] [ 5 7 ] [ 6 8 ] [ 23 31 ] [ 34 46 ] =