MATLAB R2024a Prerelease가 나왔습니다. Release note를 보고 자주 또는 종종 사용할 것 같은 것만 몇 가지 추려봤습니다. 1. 자유로워진 로컬 함수의 위치 로컬 함수를 코드 중간에서 정의할 수 있게 됩니다. 다만 if, for와 같은 conditional context 내에서는 정의할 수 없습니다. 2. Check spelling 기능 툴스트립-VIEW의 오른쪽 끝에 있습니다. 라이브 에디터의 텍스트, M-파일의 주석에서 파란색 밑줄로 보여줍니다. 3. createArray 함수 createArray를 이용하여 특정 클래스의 행렬을 만들 수 있습니다. 예전에는 클래스마다 초기화된 행렬을 만드는 방법이 달랐습니다. 4. arguments 블록 자동완성 이 상태에서 아래의 sug..
심심해서 매트랩으로 게임을 하나 만들어봤습니다. Coin Sort라는 게임을 하다가 "이거 매트랩으로 비슷하게 만들 수 있겠는데?" 싶었거든요. 코드는 깃헙 페이지에서 받으실 수 있습니다. 룰은 간단합니다. ● number_stack_game을 실행하면 게임이 시작됩니다. ● 아래 중 하나를 입력할 수 있습니다. ○ 엔터: 숫자가 내려와서 보드를 채웁니다. ○ 숫자숫자(예: 12, 53): 첫 번째 숫자 열에서 두 번째 열로 숫자를 옮깁니다. ■ 첫 번째 열의 맨 위와 두 번째 열의 맨 위는 같은 숫자여야 합니다. ■ 같은 숫자들의 덩어리 단위로만 옮깁니다. ■ 그냥 한번 해보시면 압니다. ○ m: merge를 뜻합니다. 한 가지 숫자로 꽉 찬 열이 있다면 1만큼 높은 숫자 2개로 바꿉니다. ■ 열이 4..
이 글은 성공기보다는 실패기에 더 가깝다. 어쨌든 삽질의 기록이라도 남겨두고자 한다. 인터넷 기사를 읽다 보면 "오, 이 사람 글 재밌는데?"라는 생각이 들 때가 있다. 그래서 그 사람이 쓴 글을 검색해서 찾아 읽는다. 그런데 이 검색이 잘 되지 않아 종종 답답하다. 동아사이언스에서 재밌는 글을 읽었다. 하버드 의대생도 틀리는 문제?라니... 일단 기사 제목부터 낚시성이 짙은 것이 확 끌리지 않는가? 제목을 보아하니 시리즈물인 것 같다. 글쓴이는 정신과 전문의 박한선 씨라는데, 꽤 오랫동안 글을 올리고 있는 듯 하다. 이 분의 글을 더 읽고 싶어서 기사 맨 밑에 있는 "모든기사보기"를 클릭했으나 동작하지 않는다. 안되잖아? 이럴 땐 뭐다? 어... 만족스럽지 않다. 일단 이 분, 글을 너무 많이 썼고 너..
간단한 예제를 통해 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..