간단한 예제를 통해 K-최근접 이웃 알고리즘(K-Nearest Neighbor; KNN)에 대해 알아보고자 한다. 본 예제의 내용은 한빛미디어의 책 혼자 공부하는 머신러닝+딥러닝의 내용 일부를 매트랩으로 구현한 것이다. 본 예제 실행을 위해서는 Statistics and Machine Learning Toolbox가 필요하다. 1. 데이터 준비 % 빙어(smelt)의 길이와 무게 smelt_length = [9.8, 10.5, 10.6, 11.0, 11.2, 11.3, 11.8, 11.8, 12.0, 12.2, 12.4, 13.0, 14.3, 15.0]; smelt_weight = [6.7, 7.5, 7.0, 9.7, 9.8, 8.7, 10.0, 9.9, 9.8, 12.2, 13.4, 12.2, 19.7..
수치해석 강의 중 굉장히 좋은 질문을 받았다. 왜 fprintf를 쓸 때에는 뒤에 세미콜론을 안 붙여도 되나요? 관찰력이 좋거나 호기심이 많은 사람이라면 한번쯤 가져봄직한 의문이다. 이 질문에 대한 힌트는 함수의 반환값 존재 여부와 반환값 무시 여부에 있다. 우선 세미콜론은 연산 결과를 출력하지 않을 때 사용한다. >> e = exp(1) e = 2.7183 >> e = exp(1); >> 등호 =도 대입연산자라는 연산자이므로 대입연산의 결과가 출력된다. 그 결과를 보고 싶지 않다면, 즉 변수 e에 값을 대입만 하고 그 결과를 보고 싶지 않다면 세미콜론을 붙이면 된다. 반환값이 없는 함수를 호출하면 세미콜론 여부와 무관하게 아무것도 출력되지 않는다. function fun(x) x = x^2; end >..
함수 핸들에 대해 얘기해보고자 한다. 함수를 어떤 동작function을 하는 동사verb로서가 아니라 객체object로 다룰 수 있는 명사noun로서 취급하는 것은 개념의 전환이 필요한 부분이다. 이는 프로그래밍뿐만 아니라 수학에서도 모두 필요한 아이디어이다. 우리에게 익숙한 함수의 모양은 아래 그림과 같다. 물론 경우에 따라서는 입력이나 출력, 또는 둘 다 없을 수도 있다. 어쨌든 함수는 일동의 동작이다. 그런데 종종 함수를 동작이 아니라 객체로 다루고 싶을 때가 있다. 예를 들어 아래와 같은 질문을 생각해보자 함수 myadd는 입력 인자를 몇 개 받는가? 이 기능을 함수로 만든다면 이런 모양이 될 것이다. 함수명: num_input_args 입력: 함수 myadd 출력: myadd의 입력 인자 개수 ..
n차원 구의 부피는 어떻게 계산할까요? 어...음... n차원 구가 무엇인지부터 말을 할 수 있어야겠군요. 3차원 구는 3차원 공간의 점들 중 어떤 한 점에서 떨어진 거리가 어떤 고정된 상수인 점들의 집합입니다. 3차원 단위구는 한 점에서 떨어진 거리가 1인 점들의 집합이죠. 그렇다면 2차원 구는 한 점에서 떨어진 거리가 어떤 고정된 상수인 2차원 공간의 점들의 집합이라고 볼 수 있겠군요. 네, 원입니다. 이 개념을 n차원으로 확장하지 못할 이유는 없습니다. n차원 구는 n차원 공간의 점들 중 어떤 한 점에서 떨어진 거리가 고정된 상수인 점들의 집합이고, n차원 단위구는 이 거리가 1인 점들의 집합일 겁니다. 2차원 구(원)의 부피는 $$ V(2) = \pi r^2 $$ 이죠. 3차원 구의 부피는 $$ ..
매트랩 단톡방에서 재밌는 문제가 나왔습니다. 숫자에 통화 표기처럼 세 자리마다 쉼표를 추가하는 것인데요. 다양한 방법들이 나왔는데, 저는 매트랩스러운 방법을 생각해보았습니다. 우선 쉼표가 추가된 이상 숫자는 분명히 아니니 char 배열로시작하도록 하죠. >> J = '1234567890'; 제 아이디어는 아래와 같습니다. 1. 길이가 3의 배수가 되도록 왼쪽에 zero padding을 한다. (뒤에서 보겠지만 0이 아니어도 무관합니다.) 2. 세 자리씩 끊어지도록 reshape을 한다. (역시 매트랩은 reshape이죠.) 3. 세 자리마다 뒤에 쉼표를 추가한다. 4. 한 줄로 다시 이어붙인다. 5. 맨 뒤 쉼표를 없애고, padded zero도 없앤다. 1. 길이가 3의 배수가 되도록 왼쪽에 0을 붙입..
ccc num = input('세자리 숫자 입력(0으로 시작해도 ㄱㅊ): ', 's'); % 가능한 모든 세자리 숫자 목록 list = gen_all_nums(); invalid_judge = 0; while true % 못 맞추는 동안 if invalid_judge == 0 guess = gen_guess(list); end fprintf('혹시... %s 이거? ', guess) judge = input('', 's'); if strcmp(judge, '3s') disp('앗싸 맞췄다') break elseif ~ismember(judge, {'2s','1s2b','1s1b','1s','3b','2b','1b','out'}) warning('제대로 다시 써라') invalid_guess = 1; en..
예전에 한번 올린 글입니다만, 이번에는 애니메이션을 매트랩으로 만들어보았습니다. 아래는 매트랩 코드이며, 깃헙에도 올려두었습니다. 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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 1..
깃헙 페이지 매트랩에서 기본으로 제공하는 방법은 symbolic을 활용하는 것이다. >> A = sym('A', [2, 4]) A = [A1_1, A1_2, A1_3, A1_4] [A2_1, A2_2, A2_3, A2_4] 숫자로 구성된 행렬을 만들고 싶다면, 함수를 만들어서 써야 한다. 아래는 함수 코드와 실행 결과이다. cell unpacking이 활용되었다. function arr = idx_mat(varargin) arr_cell = cell(nargin, 1); idx = cell(nargin, 1); for i=1:nargin idx{i} = 1:varargin{i}; end [arr_cell{:}] = ndgrid(idx{:}); arr = zeros(varargin{:}); for i=1:..
이 글은 깃헙에서도 보실 수 있습니다. 클래스 만들기 아래는 간단한 직사각형 클래스 예제이다. classdef rect properties width height end methods function obj = rect(width,height) obj.width = width; obj.height = height; end end end 클래스와 이름이 같은 메서드는 생성자(Constructor)로, 인스턴스를 만들 때 호출된다. 생성자가 필수는 아니다. 하지만 생성자를 두는 것이 일반적이므로, 생성자가 없는 경우는 다루지 않겠다. >> a = rect(3,4) a = rect with properties: width: 3 height: 4 Property의 기본값 설정 인스턴스 생성 시 property의..
%% generate table % % 테이블을 만드는 방법은 여러 가지가 있지만 % 엑셀을 만들고 불러오는게 제일 편하다. itzy = readtable('itzy.xlsx'); disp(itzy) %% name indexing % % names, lastname 등은 variable이라고 부른다. % 변수를 가리키는 variable과 이름이 같으니 헷갈리지 말자. % table.varname의 형태로 각 variable에 접근할 수 있다. % table.varname은 array를 반환한다. disp('itzy.names') disp(itzy.names) disp('itzy.height') disp(itzy.height) %% numeric indexing % % 하지만 여전히 numeric inde..