본문으로 바로가기

MATLAB의 강력한 기능에 한참 매료되어서 재미를 느끼다가 보면, -특히 저처럼 영어에 약한 경우- 원하는 기능은 있는데 어떻게 찾아야할지, 내가 원하는 기능을 가진 명령이 있긴 있는건지 난감할때가 있습니다. 그런 종류의 명령어들 중에서 오늘 이야기할 행렬의 형태로 저장된 데이터에서 원하는 내용이 위치한 위치를 찾고 싶을때가 있습니다. 

물론 저도 처음 MATLAB을 사용할때 그와 같은 기능이 필요했고, 뭐 어디서 찾아봐야할지 몰라서 -언젠가 한번 이야기했었지만, 저는 MATLAB을 책으로 공부한 적이 없습니다. 그냥.. MATLAB의 너무나나도 강력한 'lookfor'명령과 'help'명령으로만 공부를 했었거든요. 요즘 버젼처럼 document가 아름다웠던 시절이 아니라서요...ㅠㅠ - 하여간 그래서 보통 필요한 기능 중 찾지 못한 명령어는 만들어서 사용했는데요.

그런데 뭐 만들어쓰는것도 나쁘진 않지만, 이 명령은 너무 쉬운데 MATLAB을 처음 공부하는 분들은 잘 모르는 명령이 있습니다. 바로 'find'명령입니다.

연습하기 위해

magic이라는 명령으로 임의의 행렬을 하나 만들어 보죠. magic은 가로 세로 대각선으로 합이 모두 같게 만들어주는 '마방진'을 만들어주는 명령입니다. 뭐 연습용이 필요했을 뿐이니 마방진이 뭔지는 그냥 넘어가죠...^^

위에 바로 find명령의 사용법이 보이실 겁니다. 83의 위치를 요구했고, 결과는 6번행에 4번줄이라네요...

당연히 범위를 입력할 수도 있습니다. 뭐 조건식으로 표현만 되면 다 되겠죠. 아참 뒤에 세미콜론(;)찍고 다시 [i, j]라고 표기한건 command window에서 캡쳐할려다 보니 한 화면에 안나와서 그런겁니다. (전 노트북이라...ㅠㅠ)

그런데 최대값이나 최소값의 위치를 찾을때는 좀 문제가 있습니다. 최대값을 찾아주는 max라는 함수를 사용해보면, '100'이라는 실제 최대값을 찾지 않고 뭔가 많이 내어놓거든요.. 그게 최소값을 찾는 min이나 최대값을 찾는 max는 벡터에서 사용하는 명령어라 2차 행렬의 경우 각 열마다 최대 혹은 최소를 찾아줍니다. 그러니 실제 최대 혹은 최소값을 찾기 위해서는 min이나 max를 연달아 두번 사용하면 뭐 됩니다. (혹시 한번에 찾는 명령어가 또 있을까요?? 헉.. matlab은 명령어나 너무 많아서 혹시 있을 지도 모르겠습니다...)

그래서 위와 같이 입력합니다. max를 연달아 두번 사용해서 '100'을 찾은 다음 그걸 find한거죠^^ 10번 행의 3번 열에 있다는 군요...^^


댓글을 달아 주세요

  1. BlogIcon 핑구야 날자 2010.09.13 08:16

    행렬 오랜만에 들어보니다. 벡터...ㅋㅋ

  2. 푸지 2010.12.09 02:34

    좋은 정보 알아갑니다~ 감사해요

  3. 전기과공돌이 2010.12.10 16:58

    안녕하세요~
    여기저기 글 남기네요 ㅋㅋ
    혹시 PSO(particle swarm optimization)아시는지..
    매트랩으로 적용하고 싶은데 도무지 어떻게 적용해야할지 모르겟네요..

  4. babister 2010.12.31 03:08

    예상하신 것처럼 max(max(x)) 대신에 max2(x)로 됩니다. 비슷한 시리즈로 min2, std2도 있죠.. 웹서핑하다가 우연히 들어오게 되었는데 평소 궁금하던 내용에 많은 답을 얻었습니다. 건필하세요..

  5. 정인 2011.07.21 06:14

    비슷한 내용이 없어서 여기에 오랜만에 질문좀 올립니다. 어떤 디렉토리안에 여러개의 파일을 저장해 두었습니다. 제가 그 중에 몇개의 파일을 불러오고 싶은데요. 잘 몰라서 여쭤봅니다.
    num에 들어가는 숫자로 구분해서 파일을 읽고 싶어서 다음과 같이 쓰긴했는데,
    filename=sprintf('D:\디렉토리\서브디렉토리\filename_%d.xxx', num);
    에러가 생깁니다. 어떻게 고치면 제대로 이용할 수 있는지 좀 가르쳐주세요.

    • BlogIcon PinkWink 2011.07.21 08:12 신고

      filename이라는 변수에 문자열로 저장을 하면 될것같습니다.
      저장될 내용을 단순히
      filename = ['경로 \ test_' num2str(i) '.txt']
      라고 하시면 될 것 같습니다. 이 때 i는 변수로 정수의 값입니다.

  6. 언제나 2012.01.13 16:25

    감사합니다 ^^ 많은도움되었습니다

  7. 하하하쏭 2013.07.19 14:19

    http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=104&docId=176841212 이것좀 봐주실수 있나요?
    제가 지식인에 올린 질문인데 여기에 쓰긴 길어질것같아 주소로 첨부합니다. 올리신 강의랑은 다른 개념이지만 해당하는 강의가 없는듯해서 여기에라도 질문을 올립니다. 혹시 아신다면 알려주실수 있으신가요? 감사합니다.

    • BlogIcon PinkWink 2013.07.22 09:39 신고

      네~ 그런데 질문부터 이해를 해야할듯한데요.
      ..............x축 좌표 . . . . . . . .
      y축 좌표 (데이터) .....
      . .
      . .
      . .
      라고 되어 있는것을
      x축 좌표 y축 좌표 ....
      (데이터) (데이터) ....
      .
      .
      .

      이렇게 바꾸시겠다는 건가요?
      이것이 어떻게 바뀌는 지 잘 모르겠네요.
      바꿀 수 없다는 이야기가 아니라,
      위 두 형식이 어떻게 서로 표현이 가능할까요?

  8. BlogIcon 길똥고 2015.09.24 09:43

    http://cafe.naver.com/iphonediy

    존 팁 감사합니다.
    좀 퍼가도 되겠죠?

  9. BlogIcon Silver Light 2017.08.14 10:40 신고

    find 함수에 대한 블로그 글 중에서 가장 정리가 잘 되어 있는 글인것 같습니다!
    덕분에 많은 도움 되었습니다 감사합니다!!

  10. 아누디 2017.10.18 15:53

    그러면 index를 안 상태에서의 x를 구하는 방법을 알고 계신가요??
    예를들어, 1000이라는 index를 알면,
    1000 = find(TMP == x) 이건 이해시켜드리기 위함이구요.

    반대로는 어떻게 하시는지요

    • BlogIcon PinkWink 2017.10.20 14:45 신고

      어떤 의미이신지..ㅠㅠ
      인덱스를 알면 그냥 호출하면 되지요...
      변수명에 괄호를 열고 인덱스를 기입하면 그 위치의 값이 나타나죠...

  11. 박튀 2018.05.16 12:45

    만약에 행렬을 A = magic (4)로해서
    [u,v] = find(A>10)
    u =[1;2;4;4;1;3]
    v =[1;2;2;3;4;4] 가 나왔다면
    이 u v행렬 자리 6개의 출력값은 어떻게 구하나요?