BRONZE
BRONZE 등급의 판매자 자료

[C언어] 행렬의 곱셈 프로그램

// 단순한 두 행렬의 곱셈 프로그램 void multi_matrix(int m1[], int m2[], int m3[], int m, int n, int l); // 행렬을 곱하는 함수. void print_matrix(int ma[], int m, int n); // 행렬을 출력하는 함수. void Get_matrix(int ma[], int m, int n); // 행렬을 생성하는 함수. int main() { int m1[12], m2[8], m3[6]; // 행렬 두개 및 결과행렬을 위한 변수. Get_matrix(m1, 3, 4); Get_matrix(m2, 4, 2); print_matrix(m1, 3, 4); print_matrix(m2, 4, 2); multi_matrix(m1, m2, m3, 3, 4, 2); print_matrix(m3, 3, 2); return 0; } Ⅰ. 문제의 제기 행렬의 곱셈은 첫 행렬의 열의 개수와 두 번째 행렬의 행의 개수가 같을 때만 정의된다. 그 결과로 나오는 행렬은 A행렬이 m*n, B행렬이 n*l 일 때, m*l이 된다. 이러한 규칙에 따라 행렬의 곱셈 프로그램을 제작해본다. 특히, 곱셈의 공식을 표현할 방법, 행렬을 어떠한 방식으로 받아오고 제어할 것인지, 저장 방식에서 배열은 2차원으로 할 것인지 1차원으로 할 것인지, 파라미터로 넘겨주는 과정에서 함수의 재사용성을 극대화하기 위해서는 어떠한 방식을 취해야 하는지를 중심으로 검토하여 본다. ※ 작성된 프로그램의 전체 소스 #붙임1 (multi.cpp) Ⅱ. 문제해결의 방식 및 알고리즘 구현 1. 프로그램 설명 행렬의 곱셈 프로그램은 배열을 이용하여 두 개의 행렬을 생성하고, 그 두 행렬을 곱한 결과를 출력하여 주는 것으로서, 함수들을 이용하여 구현한다. 2. 문제해결 접근 방식 (1) 행렬의 곱셈 공식을 표현할 방법 행렬의 곱셈은 앞서 설명한 바에 따라 첫 행렬의 열의 개수와 두 번째 행렬의 행의 개수가 같아야 한다. 곱셈을 공식으로 표현하자면-2*3, 3*2 행렬을 이용- 아래와 같다. 공식에 따르면 첫 행렬의 행 값들과 두 번째 행렬의 열 값들을 곱한 결과를 합한 것이 결과행렬에 들어가게 되는 것이다. 따라서 프로그램을 위해서는 결과행렬의 현재 행/열을 제어할 for문이 필요할 것이며, 그 와 동시에 첫 번째 행렬의 행(두 번째 행렬의 열)을 제어할 for문이 필요할 것이다. 따라서 3중 루프로 구현되어야 한다. 또한 곱한 결과를 계속해서 더해줘야 하므로 결과행렬의 현재 행/열은 한번의 초기화가 필요할 것이다. 초기화는 한번만 해주어야 하는데, 그 이유는 계산이 시작되면 계속해서 곱한 결과를 더해주어야 하기 때문이다. (2) 배열을 이용한 행렬의 표현 방법 행렬은 2차원 배열과 그 구조가 동일하다. 따라서 2차원 배열을 이용하면 간단하다. 이때 함수를 이용하면 2차원 배열은 두 개의 주소-행의 시작과 열의 시작 주소-를 가지고 있기 때문에 두 개의 포인터를 넘겨주던가, 열 값을 항상 지정해 주어야 하는 불편함이 따른다. 물론 C언어-확장자가 c인 소스-에서는 2차원 배열로 선언하여도 1차원 배열로 함수에서 받아서 사용할 수 있으므로(warning은 있다.) 크게 제한이 없으나 지금은 C++(확장자가 cpp)로 구현하기 때문에 포인터의 사용에 조심해야한다. 따라서 초기 배열을 선언은 1차원으로 한다. 크기는 행과 열을 곱한 만큼으로 잡아주고 시작한다. 함수에서도 1차원 배열로 받아오며, 이때 행/열의 값을 파라미터로 받아와 함수 내에서는 2차원 배열과 동일하게 사용한다. 2차원 배열과 동일하게 사용하는 방법은 배열은 연속된 메모리공간에 표현된 자료구조라는 점에 착안하여 행을 제어하는 변수와 열을 제어하는 변수를 놓고, 행을 제어하는 변수에 열 값을 곱해주어 행을 임의적으로 가르치게 한다. 여기에 열을 제어하는 변수를 더해주기만 하면 2차원 배열과 동일한 효과를 볼 수 있다. 따라서 2*3행렬에서 k행, j열은 k*3+j로 인덱스를 표현할 수 있을 것이다. 이 방식을 이용하면 함수에서의 이동이 자유롭고 행렬의 크기가 바뀌어도 다시 함수를 정의하지 않아서 재사용 측면에서 용이하다. 그리고 행렬을 생성하고 출력 곱셈하는 단계에서도 2차원 배열과 같이 for문의 카운터를 이용하여 충분히 제어할 수 있게 되는 것이다. 3. 알고리즘 구현 (1) 간략한 알고리즘 앞서 살펴본 문제 해결 방식에 따라 알고리즘을 작성하면, 우선 for문을 제어할 변수 3개가 필요하며, 행렬을 위한 배열 3개가 필요하다. 제어 변수를 m, n, l, 행렬을 a[m*n], b[n*l], c[m*l]이라고 한다. 두 개의 행렬을 생성하면 곱셈을 시작하는데 3개의 for문으로 이루어진 루프 안에서 계산을 한다. 첫 for문은 결과행렬 c의 행을 위해 m까지 수행되며, 두 번째 for문은 결과행렬 열을 위해 l까지 수행된다. 두 번째 for문이 시작되면 결과행렬의 현재 행/열 값을 0으로 초기화하고 다음 for문으로 들어간다. 3번째 for문은 a행렬의 열, b행렬의 행 값을 위한 것이며, 여기서 계산이 이루어 진다. 이와 같은 내용을 간단히 나타내면 아래와 같다. ⅰ. 첫 번째 for문 카운터가 m보다 같거나 크면 멈춘다. ⅱ. 두 번째 for문 카운터가 l보다 같거나 크면 ⅰ로 돌아가고, 그렇지 않으면 c의 현재위치를 0으로 초기화 한다. ⅲ. 세 번째 for문 카운터가 n보다 같거나 크면 ⅱ로 돌아가고, 그렇지 않으면 ⅳ로 간다. ⅳ. a의 현재 행/열 값과 b의 현재 행/열 값을 곱하여 c의 현재 행/열 값에 더한다. (2) 알고리즘에 따른 플로우 차트의 작성 위 알고리즘의 내용을 플로우 차트로 작성하면 아래와 같다.
5 페이지
압축파일
최초등록일 2007.05.29 최종저작일 2007.05
[C언어] 행렬의 곱셈 프로그램
  • 미리보기

    소개

    // 단순한 두 행렬의 곱셈 프로그램

    void multi_matrix(int m1[], int m2[], int m3[], int m, int n, int l); // 행렬을 곱하는 함수.
    void print_matrix(int ma[], int m, int n); // 행렬을 출력하는 함수.
    void Get_matrix(int ma[], int m, int n); // 행렬을 생성하는 함수.

    int main()
    {
    int m1[12], m2[8], m3[6]; // 행렬 두개 및 결과행렬을 위한 변수.
    Get_matrix(m1, 3, 4);
    Get_matrix(m2, 4, 2);
    print_matrix(m1, 3, 4);
    print_matrix(m2, 4, 2);
    multi_matrix(m1, m2, m3, 3, 4, 2);
    print_matrix(m3, 3, 2);
    return 0;
    }


    Ⅰ. 문제의 제기
    행렬의 곱셈은 첫 행렬의 열의 개수와 두 번째 행렬의 행의 개수가 같을 때만 정의된다. 그 결과로 나오는 행렬은 A행렬이 m*n, B행렬이 n*l 일 때, m*l이 된다. 이러한 규칙에 따라 행렬의 곱셈 프로그램을 제작해본다. 특히, 곱셈의 공식을 표현할 방법, 행렬을 어떠한 방식으로 받아오고 제어할 것인지, 저장 방식에서 배열은 2차원으로 할 것인지 1차원으로 할 것인지, 파라미터로 넘겨주는 과정에서 함수의 재사용성을 극대화하기 위해서는 어떠한 방식을 취해야 하는지를 중심으로 검토하여 본다.
    ※ 작성된 프로그램의 전체 소스 #붙임1 (multi.cpp)

    Ⅱ. 문제해결의 방식 및 알고리즘 구현
    1. 프로그램 설명
    행렬의 곱셈 프로그램은 배열을 이용하여 두 개의 행렬을 생성하고, 그 두 행렬을 곱한 결과를 출력하여 주는 것으로서, 함수들을 이용하여 구현한다.

    2. 문제해결 접근 방식
    (1) 행렬의 곱셈 공식을 표현할 방법
    행렬의 곱셈은 앞서 설명한 바에 따라 첫 행렬의 열의 개수와 두 번째 행렬의 행의 개수가 같아야 한다. 곱셈을 공식으로 표현하자면-2*3, 3*2 행렬을 이용- 아래와 같다.

    공식에 따르면 첫 행렬의 행 값들과 두 번째 행렬의 열 값들을 곱한 결과를 합한 것이 결과행렬에 들어가게 되는 것이다. 따라서 프로그램을 위해서는 결과행렬의 현재 행/열을 제어할 for문이 필요할 것이며, 그 와 동시에 첫 번째 행렬의 행(두 번째 행렬의 열)을 제어할 for문이 필요할 것이다. 따라서 3중 루프로 구현되어야 한다. 또한 곱한 결과를 계속해서 더해줘야 하므로 결과행렬의 현재 행/열은 한번의 초기화가 필요할 것이다. 초기화는 한번만 해주어야 하는데, 그 이유는 계산이 시작되면 계속해서 곱한 결과를 더해주어야 하기 때문이다.

    (2) 배열을 이용한 행렬의 표현 방법
    행렬은 2차원 배열과 그 구조가 동일하다. 따라서 2차원 배열을 이용하면 간단하다. 이때 함수를 이용하면 2차원 배열은 두 개의 주소-행의 시작과 열의 시작 주소-를 가지고 있기 때문에 두 개의 포인터를 넘겨주던가, 열 값을 항상 지정해 주어야 하는 불편함이 따른다. 물론 C언어-확장자가 c인 소스-에서는 2차원 배열로 선언하여도 1차원 배열로 함수에서 받아서 사용할 수 있으므로(warning은 있다.) 크게 제한이 없으나 지금은 C++(확장자가 cpp)로 구현하기 때문에 포인터의 사용에 조심해야한다. 따라서 초기 배열을 선언은 1차원으로 한다. 크기는 행과 열을 곱한 만큼으로 잡아주고 시작한다. 함수에서도 1차원 배열로 받아오며, 이때 행/열의 값을 파라미터로 받아와 함수 내에서는 2차원 배열과 동일하게 사용한다. 2차원 배열과 동일하게 사용하는 방법은 배열은 연속된 메모리공간에 표현된 자료구조라는 점에 착안하여 행을 제어하는 변수와 열을 제어하는 변수를 놓고, 행을 제어하는 변수에 열 값을 곱해주어 행을 임의적으로 가르치게 한다. 여기에 열을 제어하는 변수를 더해주기만 하면 2차원 배열과 동일한 효과를 볼 수 있다. 따라서 2*3행렬에서 k행, j열은 k*3+j로 인덱스를 표현할 수 있을 것이다. 이 방식을 이용하면 함수에서의 이동이 자유롭고 행렬의 크기가 바뀌어도 다시 함수를 정의하지 않아서 재사용 측면에서 용이하다. 그리고 행렬을 생성하고 출력 곱셈하는 단계에서도 2차원 배열과 같이 for문의 카운터를 이용하여 충분히 제어할 수 있게 되는 것이다.


    3. 알고리즘 구현
    (1) 간략한 알고리즘
    앞서 살펴본 문제 해결 방식에 따라 알고리즘을 작성하면, 우선 for문을 제어할 변수 3개가 필요하며, 행렬을 위한 배열 3개가 필요하다. 제어 변수를 m, n, l, 행렬을 a[m*n], b[n*l], c[m*l]이라고 한다. 두 개의 행렬을 생성하면 곱셈을 시작하는데 3개의 for문으로 이루어진 루프 안에서 계산을 한다. 첫 for문은 결과행렬 c의 행을 위해 m까지 수행되며, 두 번째 for문은 결과행렬 열을 위해 l까지 수행된다. 두 번째 for문이 시작되면 결과행렬의 현재 행/열 값을 0으로 초기화하고 다음 for문으로 들어간다. 3번째 for문은 a행렬의 열, b행렬의 행 값을 위한 것이며, 여기서 계산이 이루어 진다. 이와 같은 내용을 간단히 나타내면 아래와 같다.
    ⅰ. 첫 번째 for문 카운터가 m보다 같거나 크면 멈춘다.
    ⅱ. 두 번째 for문 카운터가 l보다 같거나 크면 ⅰ로 돌아가고, 그렇지 않으면 c의 현재위치를 0으로 초기화 한다.
    ⅲ. 세 번째 for문 카운터가 n보다 같거나 크면 ⅱ로 돌아가고, 그렇지 않으면 ⅳ로 간다.
    ⅳ. a의 현재 행/열 값과 b의 현재 행/열 값을 곱하여 c의 현재 행/열 값에 더한다.

    (2) 알고리즘에 따른 플로우 차트의 작성
    위 알고리즘의 내용을 플로우 차트로 작성하면 아래와 같다.

    컴파일 실행환경

    C언어

    참고자료

    · 없음
  • 자료후기

    Ai 리뷰
    지식판매자가 등록한 자료는 내용이 풍부하고 깊이 있는 분석이 돋보입니다. 과제에 바로 활용할 수 있는 내용이 많아 매우 만족합니다. 감사드립니다.
    왼쪽 화살표
    오른쪽 화살표
  • 자주묻는질문의 답변을 확인해 주세요

    해피캠퍼스 FAQ 더보기

    꼭 알아주세요

    • 자료의 정보 및 내용의 진실성에 대하여 해피캠퍼스는 보증하지 않으며, 해당 정보 및 게시물 저작권과 기타 법적 책임은 자료 등록자에게 있습니다.
      자료 및 게시물 내용의 불법적 이용, 무단 전재∙배포는 금지되어 있습니다.
      저작권침해, 명예훼손 등 분쟁 요소 발견 시 고객센터의 저작권침해 신고센터를 이용해 주시기 바랍니다.
    • 해피캠퍼스는 구매자와 판매자 모두가 만족하는 서비스가 되도록 노력하고 있으며, 아래의 4가지 자료환불 조건을 꼭 확인해주시기 바랍니다.
      파일오류 중복자료 저작권 없음 설명과 실제 내용 불일치
      파일의 다운로드가 제대로 되지 않거나 파일형식에 맞는 프로그램으로 정상 작동하지 않는 경우 다른 자료와 70% 이상 내용이 일치하는 경우 (중복임을 확인할 수 있는 근거 필요함) 인터넷의 다른 사이트, 연구기관, 학교, 서적 등의 자료를 도용한 경우 자료의 설명과 실제 자료의 내용이 일치하지 않는 경우

찾으시던 자료가 아닌가요?

지금 보는 자료와 연관되어 있어요!
왼쪽 화살표
오른쪽 화살표
문서 초안을 생성해주는 EasyAI
안녕하세요. 해피캠퍼스의 방대한 자료 중에서 선별하여 당신만의 초안을 만들어주는 EasyAI 입니다.
저는 아래와 같이 작업을 도와드립니다.
- 주제만 입력하면 목차부터 본문내용까지 자동 생성해 드립니다.
- 장문의 콘텐츠를 쉽고 빠르게 작성해 드립니다.
- 스토어에서 무료 캐시를 계정별로 1회 발급 받을 수 있습니다. 지금 바로 체험해 보세요!
이런 주제들을 입력해 보세요.
- 유아에게 적합한 문학작품의 기준과 특성
- 한국인의 가치관 중에서 정신적 가치관을 이루는 것들을 문화적 문법으로 정리하고, 현대한국사회에서 일어나는 사건과 사고를 비교하여 자신의 의견으로 기술하세요
- 작별인사 독후감
해캠 AI 챗봇과 대화하기
챗봇으로 간편하게 상담해보세요.
2025년 05월 12일 월요일
AI 챗봇
안녕하세요. 해피캠퍼스 AI 챗봇입니다. 무엇이 궁금하신가요?
4:23 오전