MATLAB LanguageMATLAB 언어 시작하기

버전

번역 해제 출시일
1.0 1984-01-01
2 1986-01-01
1987-01-01
3.5 1990-01-01
4 1992-01-01
4.2c 1994-01-01
5.0 제 8 권 1996-12-01
5.1 9 권 1997-05-01
5.1.1 R9.1 1997-05-02
5.2 R10 1998-03-01
5.2.1 R10.1 1998-03-02
5.3 R11 1999-01-01
5.3.1 R11.1 1999-11-01
6.0 R12 2000-11-01
6.1 R12.1 2001-06-01
6.5 R13 2002-06-01
6.5.1 R13SP2 2003-01-01
6.5.2 R13SP2 2003-01-02
7 R14 2006-06-01
7.0.4 R14SP1 2004-10-01
7.1 R14SP3 2005-08-01
7.2 R2006a 2006-03-01
7.3 R2006b 2006-09-01
7.4 R2007a 2007-03-01
7.5 R2007b 2007-09-01
7.6 R2008a 2008-03-01
7.7 R2008b 2008-09-01
7.8 R2009a 2009-03-01
7.9 R2009b 2009-09-01
7.10 R2010a 2010-03-01
7.11 R2010b 2010-09-01
7.12 R2011a 2011-03-01
7.13 R2011b 2011-09-01
7.14 R2012a 2012-03-01
8.0 R2012b 2012-09-01
8.1 R2013a 2013-03-01
8.2 R2013b 2013-09-01
8.3 R2014a 2014-03-01
8.4 R2014b 2014-09-01
8.5 R2015a 2015-03-01
8.6 R2015b 2015-09-01
9.0 R2016a 2016-03-01
9.1 R2016b 2016-09-14
9.2 R2017a 2017-03-08

참고 항목 : Wikipedia의 MATLAB 릴리즈 기록 .

안녕하세요 세계

MATLAB 편집기에서 새 빈 문서를 엽니 다 (최근 버전의 MATLAB에서는 도구 모음의 홈 탭을 선택하고 새 스크립트 클릭). 새 스크립트를 작성하는 기본 키보드 단축키는 Ctrl-n 입니다.

또한, 입력 edit myscriptname.m 파일이 열립니다 myscriptname.m 편집하거나이 MATLAB 경로에 존재하지 않는 경우 파일을 만들 수 있습니다.

편집기에서 다음을 입력하십시오.

disp('Hello, World!');

도구 모음의 편집기 탭을 선택하고 다른 이름으로 저장을 클릭하십시오. 문서를 helloworld.m 이라는 현재 디렉토리의 파일에 저장하십시오. 제목이없는 파일을 저장하면 파일의 이름을 지정하는 대화 상자가 나타납니다.

MATLAB 명령 창에 다음을 입력하십시오.

>> helloworld

MATLAB Command Window에서 다음과 같은 응답을 볼 수 있습니다.

Hello, World!

명령 창에서 우리가 작성했거나 MATLAB과 함께 제공되는 함수 또는 스크립트 파일의 이름을 입력하여 실행할 수 있습니다.

여기서는 'helloworld'스크립트를 실행했습니다. 확장명 ( .m )을 입력 할 필요가 없습니다. 스크립트 파일에 담긴 지시 사항은 MATLAB에 의해 실행됩니다. 여기서 'Hello, World!' disp 함수를 사용한다.

이 방법으로 스크립트 파일을 작성하여 나중에 (다시) 사용할 수 있도록 일련의 명령을 저장할 수 있습니다.

행렬 및 배열

MATLAB에서 가장 기본적인 데이터 유형은 숫자 배열입니다. 스칼라, 1 차원 벡터, 2 차원 행렬 또는 ND 다차원 배열 일 수 있습니다.

% a 1-by-1 scalar value
x = 1;

행 벡터를 만들려면 요소를 괄호 안에 공백이나 쉼표로 구분하여 입력하십시오.

% a 1-by-4 row vector
v = [1, 2, 3, 4];
v = [1 2 3 4];

열 벡터를 만들려면 요소를 세미콜론으로 구분하십시오.

% a 4-by-1 column vector
v = [1; 2; 3; 4];

행렬을 만들려면 이전처럼 행을 세미콜론으로 구분하여 입력합니다.

% a 2 row-by-4 column matrix
M = [1 2 3 4; 5 6 7 8];

% a 4 row-by-2 column matrix
M = [1 2; ...
     4 5; ...
     6 7; ...
     8 9];

동일하지 않은 행 / 열 크기의 행렬을 만들 수 없습니다. 모든 행은 동일한 길이 여야하며 모든 열은 동일한 길이 여야합니다.

% an unequal row / column matrix
M = [1 2 3 ; 4 5 6 7]; % This is not valid and will return an error

% another unequal row / column matrix
M = [1 2 3; ...
     4   5; ...
     6 7 8; ...
     9   10];     % This is not valid and will return an error

벡터 또는 행렬을 조 변경하려면, .' -operator 또는 ' 연산자를 사용하여 Hermitian conjugate를 가져옵니다.이 Hermitian conjugate는 이항의 복합 공액입니다. 실제 행렬의 경우이 둘은 동일합니다.

% create a row vector and transpose it into a column vector
v = [1 2 3 4].';              % v is equal to [1; 2; 3; 4];

% create a 2-by-4 matrix and transpose it to get a 4-by-2 matrix
M = [1 2 3 4; 5 6 7 8].';     % M is equal to [1 5; 2 6; 3 7; 4 8]

% transpose a vector or matrix stored as a variable
A = [1 2; 3 4];
B = A.';                      % B is equal to [1 3; 2 4]

2 차원 이상의 배열의 경우 문자 그대로 직접 입력 할 수있는 직접적인 언어 구문이 없습니다. 대신에 함수를 사용하여 (예 : ones , zeros , rand ) 함수를 사용하거나 다른 배열 ( cat , reshape , permute 와 같은 함수 사용)을 조작해야합니다. 몇 가지 예 :

% a 5-by-2-by-4-by-3 array (4-dimensions)
arr = ones(5, 2, 4, 3);

% a 2-by-3-by-2 array (3-dimensions)
arr = cat(3, [1 2 3; 4 5 6], [7 8 9; 0 1 2]);

% a 5-by-4-by-3-by-2 (4-dimensions)
arr = reshape(1:120, [5 4 3 2]);

인덱싱 행렬 및 배열

MATLAB은 행렬 및 배열의 ​​요소를 색인화 (액세스)하는 몇 가지 메소드를 허용합니다.

  • 아래 첨자 인덱싱 - 행렬의 각 차원에서 개별적으로 원하는 요소의 위치를 ​​지정합니다.
  • 선형 인덱싱 - 매트릭스가 치수와 상관없이 벡터로 처리됩니다. 즉, 행렬의 각 위치를 단일 숫자로 지정합니다.
  • 논리 색인 - 반환 할 값을 지정하기 위해 마스크로 색인하려고하는 행렬의 차원이 동일한 논리 행렬 (및 true 값과 false 값의 행렬)을 사용합니다.

이 세 가지 방법은 이제 다음과 같은 3x3 행렬 M 을 예로 들어 자세히 설명합니다.

>> M = magic(3)

ans = 

       8    1    6
       3    5    7
       4    9    2

첨자 인덱싱

요소에 액세스하는 가장 직접적인 방법은 행 - 열 인덱스를 지정하는 것입니다. 예를 들어 두 번째 행과 세 번째 열의 요소에 액세스하는 경우 :

>> M(2, 3)

ans =

      7

제공되는 첨자의 수는 M 이 갖는 차원의 수와 정확하게 일치합니다 (이 예에서 두 개).

아래 첨자의 순서는 수학 관습과 동일합니다. 행 색인이 첫 번째입니다. 또한 MATLAB 인덱스 대부분의 프로그래밍 언어처럼 0 아닌 1 시작 합니다.

단일 숫자 대신 각 좌표에 벡터를 전달하여 한 번에 여러 요소를 인덱싱 할 수 있습니다. 예를 들어 전체 두 번째 행을 가져 오려면 첫 번째, 두 번째 및 세 번째 열을 지정하도록 지정할 수 있습니다.

>> M(2, [1,2,3])

ans =

       3    5    7

MATLAB에서 벡터 [1,2,3] 은 콜론 연산자 (예 : 1:3 사용하여보다 쉽게 ​​생성됩니다. 이것을 인덱싱에도 사용할 수 있습니다. 전체 행 (또는 열)을 선택하려면, MATLAB 방금 지정할 수 있도록하여 바로 가기를 제공합니다 : . 예를 들어, 다음 코드는 전체 두 번째 행

>> M(2, :)

ans =

       3    5    7

또한 MATLAB은 end 키워드 형태로 차원의 마지막 요소를 지정하기위한 바로 가기를 제공합니다. end 키워드는 마치 해당 측정 기준의 마지막 요소 번호 인 것처럼 작동합니다. 따라서 2 열에서 마지막 열까지의 모든 열을 원한다면 다음과 같이 작성할 수 있습니다.

>> M(2, 2:end)

ans =

       5    7

첨자 인덱싱은 다른 열과 행에서 단일 값을 추출 할 수 없으므로 제한적일 수 있습니다. 모든 행과 열의 조합을 추출합니다.

>> M([2,3], [1,3])
ans =

       3    7
       4    2

예를 들어 첨자 인덱싱에서는 요소 M(2,1) 또는 M(3,3) 만 추출 할 수 없습니다. 이렇게하려면 선형 인덱싱을 고려해야합니다.

선형 인덱싱

MATLAB을 사용하면 하나의 차원 만 사용하여 인덱싱 할 때 n 차원 배열을 1 차원 배열로 처리 할 수 ​​있습니다. 첫 번째 요소에 직접 액세스 할 수 있습니다.

>> M(1)

ans = 

       8

배열은 MATLAB에서 컬럼 우선 순위 로 저장된다는 점에 유의하십시오. 즉, 먼저 컬럼을 아래로 내려 가면서 요소에 액세스합니다. 따라서 M(2)3 첫 번째 열의 두 번째 요소이고 M(4) 는 두 번째 열의 첫 번째 요소가됩니다. 즉

>> M(4)

ans = 

        1

첨자 인덱스를 선형 인덱스로 변환하는 내장 함수가 있으며, 그 반대의 경우도 각각 sub2indind2sub 입니다. 아래 첨자 ( r , c )를 선형 인덱스로 수동으로 변환 할 수 있습니다.

idx = r + (c-1)*size(M,1)

이를 이해하려면 첫 번째 열에 있으면 선형 인덱스가 단순히 행 인덱스가됩니다. 위의 수식은 c == 1 , (c-1) == 0 됩니다. 다음 열에서 선형 인덱스는 행 번호와 이전 열의 모든 행을 더한 값입니다.

end 키워드는 여전히 적용되며 배열의 마지막 요소 즉 M(end) == M(end, end) == 2 합니다.

선형 인덱싱을 사용하여 여러 요소를 인덱싱 할 수도 있습니다. 그렇게하면 리턴 된 행렬은 인덱스 벡터 행렬과 동일한 모양을 갖게됩니다.

M(2:4)2:4 가 행 벡터 [2,3,4] 나타 내기 때문에 행 벡터를 반환합니다.

>> M(2:4)

ans =

        3    4    1

다른 예로서, M([1,2;3,4])[1,2;3,4] 가 2 x 2 행렬이기 때문에 2 x 2 행렬을 반환합니다. 자신을 설득하려면 아래 코드를 참조하십시오.

>> M([1,2;3,4])

ans =

       8        3
       4        1

: with를 사용한 인덱싱은 항상 열 벡터를 반환합니다.

>> M(:)

ans = 

        8
        3
        4
        1
        5
        9
        6
        7
        2

이 예제는 또한 선형 인덱싱을 사용할 때 MATLAB이 요소를 반환하는 순서를 보여줍니다.

논리적 색인

세 번째 인덱싱 방법은 논리 매트릭스, 즉 true 또는 false 값만 포함하는 매트릭스를 마스크로 사용하여 원하지 않는 요소를 필터링하는 것입니다. 예를 들어, 5 보다 큰 M 모든 원소를 찾으려면 논리 행렬을 사용할 수 있습니다

>> M > 5

ans =

    1    0    1
    0    0    1
    0    1    0

M 을 인덱싱하고 다음과 같이 5 보다 큰 값만 반환합니다.

>> M(M > 5)

ans =

        8
        9
        6
        7

이 숫자가 제자리에 머물러 있기를 원하면 (예 : 매트릭스의 모양을 유지하십시오), 논리 칭찬에 지정할 수 있습니다

>> M(~(M > 5)) = NaN

ans = 

    8      NaN    6
    NaN    NaN    7
    NaN    9      Nan

논리적 인 색인을 사용하여 iffor 문이 포함 된 복잡한 코드 블록을 줄일 수 있습니다.

비선형 화 (선형 인덱싱을 사용하여 이미 단일 루프로 단축 됨) :

for elem = 1:numel(M)
  if M(elem) > 5
    M(elem) = M(elem) - 2;
  end
end

논리 색인을 사용하여 다음 코드로 줄일 수 있습니다.

idx = M > 5;
M(idx) = M(idx) - 2;

또는 더 짧은 :

M(M > 5) = M(M > 5) - 2;

색인 생성에 대한 추가 정보

고차원 행렬

위에서 언급 한 모든 방법은 n 차원으로 일반화합니다. 예를 들어 3 차원 행렬 M3 = rand(3,3,3) 를 사용하면 3 차원의 두 번째 슬라이스에있는 모든 행과 열에 액세스 할 수 있습니다.

>> M(:,:,2)

선형 인덱싱을 사용하여 두 번째 슬라이스의 첫 번째 요소에 액세스 할 수 있습니다. 선형 인덱싱은 첫 번째 슬라이스의 모든 행과 모든 열 다음에 두 번째 슬라이스로 이동합니다. 따라서 해당 요소의 선형 색인은 다음과 같습니다.

>> M(size(M,1)*size(M,2)+1)

사실, MATLAB에서 모든 행렬은 n 차원입니다. 대부분의 다른 n 차원의 크기는 하나입니다. 그래서, 만약 a = 2 라면 a(1) == 2 (기대할 것임) 뿐만 아니라 a(1, 1) == 2 , a(1, 1, 1) == 2 , a(1, 1, 1, ..., 1) == 2 등등. 이러한 "추가"차원 (크기 1 )은 단일 차원 으로 참조됩니다. squeeze 명령어는 그것들을 제거 할 것이고, permute 를 사용하여 주위 차원의 순서를 교환 할 수있다 (그리고 필요할 경우 싱글 톤 차원을 도입한다).

n 차원 행렬은 m 개의 첨자 (m <= n)를 사용하여 색인화 할 수도 있습니다. 선형 인덱스가 (n-m + 1) 차원을 참조하는 것처럼 마스트 (m-1) 첨자가 나머지 (n-m + 1) 차원을 참조하는 반면 규칙은 첫 번째 m- 정렬. 다음은 그 예입니다.

>> M = reshape(1:24,[2,3,4]);
>> M(1,1)
ans =
     1
>> M(1,10)
ans =
    19
>> M(:,:)
ans =
     1     3     5     7     9    11    13    15    17    19    21    23
     2     4     6     8    10    12    14    16    18    20    22    24

반환되는 요소의 범위

첨자 인덱싱을 사용하면 둘 이상의 차원에서 둘 이상의 요소를 지정하면 MATLAB은 가능한 좌표 쌍을 반환합니다. 예를 들어, M ([1,2], [1,3])을 사용하면 MATLAB은 M(1,1)M(2,3) 반환하지만 M(1,3)M(2,1) . 이것은 좌표 쌍 목록에 대한 요소를 찾고 있지만 더 큰 행렬 A = rand(20) 의 예를 고려할 때 직관적으로 보일 수 있습니다 ( A 는 이제 20 -by- 20 ). 오른쪽 상단 사분면. 이 경우 해당 사분면의 모든 좌표 쌍 (이 경우이 경우 100 쌍)을 지정하는 대신 A(1:10, 11:end) 와 같이 원하는 10 개의 행과 10 열만 지정하면됩니다. 이와 같은 행렬을 슬라이스 하는 것은 좌표 쌍 목록을 요구하는 것보다 훨씬 더 일반적입니다.

좌표 쌍 목록을 얻으려는 경우 가장 간단한 해결책은 선형 인덱싱으로 변환하는 것입니다. 반환 할 열 인덱스 벡터가있는 문제를 생각해보십시오. 벡터의 각 행에는 행렬의 해당 행에 대해 반환 할 열 번호가 들어 있습니다. 예를 들어

colIdx = [3;2;1]

따라서이 경우 (1,3) , (2,2)(3,1) 의 요소를 실제로 돌려 받고 싶습니다. 따라서 선형 인덱싱 사용 :

>> colIdx = [3;2;1];
>> rowIdx = 1:length(colIdx);
>> idx = sub2ind(size(M), rowIdx, colIdx);
>> M(idx)

ans = 

        6    5    4

요소를 여러 번 반환하기

아래 첨자 및 선형 인덱싱을 사용하면 인덱스를 반복하여 여러 번 요소를 반환 할 수도 있습니다.

>> M([1,1,1,2,2,2])

ans = 

        8    8    8    3    3    3

이를 사용하여 예를 들어 전체 행과 열을 복제하여 첫 번째 행과 마지막 열을 반복 할 수 있습니다

>> M([1, 1:end], [1:end, end])

ans = 

        8    1    6    6 
        8    1    6    6
        3    5    7    7
        4    9    2    2

자세한 내용은 여기를 참조 하십시오 .

자신을 돕기

MATLAB에는 간단한 곱셈에서 이미지 인식 도구 상자에 이르는 다양한 내장 스크립트 및 함수가 제공됩니다. 사용할 함수에 대한 정보를 얻으려면 명령 행에 help functionname 을 입력하십시오. 예를 들어 help 기능을 사용할 수 있습니다.

그것을 사용하는 방법에 대한 정보는 다음을 입력하여 얻을 수 있습니다 :

>> help help

명령 창에서. 그러면 함수 help 사용에 대한 정보가 반환됩니다. 찾으려는 정보가 아직 명확하지 않은 경우 함수의 문서 페이지를 사용해보십시오. 간단히 다음을 입력하십시오.

>> doc help

명령 창에서. 그러면 '도움말'이 어떻게 작동하는지 이해하는 데 필요한 모든 정보를 제공하는 기능 help 에 대한 페이지의 탐색 가능한 문서가 열립니다.

이 절차는 모든 내장 함수 및 기호에 적용됩니다.

자신의 함수를 개발할 때 함수 파일 맨 위에 또는 함수 선언 바로 뒤에 주석을 추가하여 자신의 도움말 섹션을 만들 수 있습니다.

간단한 함수의 예는 multiplyby2 파일에 저장 multiplyby2.m

function [prod]=multiplyby2(num)
% function MULTIPLYBY2 accepts a numeric matrix NUM and returns output PROD 
% such that all numbers are multiplied by 2

    prod=num*2;
end

또는

% function MULTIPLYBY2 accepts a numeric matrix NUM and returns output PROD 
% such that all numbers are multiplied by 2

function [prod]=multiplyby2(num)
    prod=num*2;
end

이것은 코드를 작성한 후 주 / 월 / 년 코드를 선택할 때 매우 유용합니다.

helpdoc 기능은 많은 정보를 제공하며 이러한 기능을 사용하는 방법을 배우면 빠르게 진행되고 MATLAB을 효율적으로 사용할 수 있습니다.

입력 및 쓰기 출력 읽기

모든 프로그래밍 언어와 마찬가지로 Matlab은 다양한 형식으로 읽고 쓸 수 있도록 설계되었습니다. 기본 라이브러리는 각 버전 업데이트에 더 많은 형식이 포함 된 많은 텍스트, 이미지, 비디오, 오디오, 데이터 형식을 지원합니다. 여기 에서 지원되는 파일 형식의 전체 목록과 가져 오기에 사용할 기능을 확인하십시오 .

파일을로드하기 전에 데이터가 될 항목과 컴퓨터에서 데이터를 구성하는 방법을 스스로에게 물어야합니다. 다음과 같은 형식의 txt / csv 파일이 있다고 가정 해보십시오.

Fruit,TotalUnits,UnitsLeftAfterSale,SellingPricePerUnit
Apples,200,67,$0.14
Bananas,300,172,$0.11
Pineapple,50,12,$1.74

첫 번째 열은 String 형식이고 두 번째, 세 번째 열은 Numeric 열, 마지막 열은 Currency 형식입니다. 우리가 오늘 Matlab을 사용하여 얼마나 많은 수익을 올렸는지 알아보고이 txt / csv 파일에로드하기를 원한다고 가정 해 봅시다. 링크를 확인한 후 문자열 및 숫자 형식의 txt 파일이 textscan 의해 처리된다는 것을 textscan 있습니다. 그래서 우리는 시도 할 수 있었다 :

fileID = fopen('dir/test.txt'); %Load file from dir
C = textscan(fileID,'%s %f %f %s','Delimiter',',','HeaderLines',1); %Parse in the txt/csv

여기서 %s 는 요소가 String 유형이고, %f 는 요소가 Float 유형이고 파일이 ","로 구분됨을 나타냅니다. HeaderLines 옵션은 첫번째 N 라인을 건너 뛰도록 요청합니다. 첫 번째 라인은 첫 번째 라인 (헤더 라인)을 건너 뛰는 것을 의미합니다.

이제 C는 우리가로드 한 데이터이며, 각 셀은 4 개의 셀로 구성된 셀 배열 형식이며, 각각은 txt / csv 파일에 데이터 열을 포함합니다.

먼저 오늘 두 번째 열에서 세 번째 열을 뺀 수의 과일을 계산하려면 다음을 수행하십시오.

sold = C{2} - C{3}; %C{2} gives the elements inside the second cell (or the second column)

이제 우리는이 벡터에 단위당 가격을 곱하고 싶습니다. 먼저 문자열의 열을 숫자 열로 변환 한 다음 Matlab의 cell2mat 사용하여 숫자 행렬로 변환해야합니다. 먼저 우리가해야 할 일은 cell2mat 을 스트립 ( cell2mat "$"표시를 없애려면 여러 가지 방법이 있습니다. 가장 직접적인 방법은 간단한 정규식을 사용하는 것입니다.

D = cellfun(@(x)(str2num(regexprep(x, '\$',''))), C{4}, 'UniformOutput', false);%cellfun allows us to avoid looping through each element in the cell.

또는 루프를 사용할 수 있습니다.

for t=1:size(C{4},1)
   D{t} = str2num(regexprep(C{4}{t}, '\$',''));
end

E = cell2mat(D)% converts the cell array into a Matrix

str2num 함수는 "$"기호가 숫자 형식으로 제거 된 문자열을 변환하고 cell2mat 는 숫자 요소의 셀을 숫자 행렬로 변환합니다

이제 단위 당 비용으로 판매 된 단위를 곱할 수 있습니다.

revenue = sold .* E; %element-wise product is denoted by .* in Matlab

totalrevenue = sum(revenue);

셀 배열

동일한 클래스의 요소는 종종 배열로 연결될 수 있습니다 (예를 들어 함수 핸들과 같은 몇 가지 드문 예외가 있음). 숫자 스칼라는, 클래스의 기본적으로 double , 매트릭스에 저장할 수 있습니다.

>> A = [1, -2, 3.14, 4/5, 5^6; pi, inf, 7/0, nan, log(0)]
A =
   1.0e+04 *
    0.0001   -0.0002    0.0003    0.0001    1.5625
    0.0003       Inf       Inf       NaN      -Inf

MATLAB에서 char 클래스의 char 는 비슷한 구문을 사용하여 배열에 저장할 수도 있습니다. 이러한 배열은 다른 많은 프로그래밍 언어의 문자열과 유사합니다.

>> s = ['MATLAB ','is ','fun']
s =
MATLAB is fun

둘 다 대괄호 [] 사용하고 있음에도 불구하고 결과 클래스가 다릅니다. 그러므로 그들에게 행해질 수있는 조작은 또한 다릅니다.

>> whos
  Name      Size            Bytes  Class     Attributes

  A         2x5                80  double              
  s         1x13               26  char                

실제로 배열 s'MATLAB ' , 'is ''fun' 문자열 배열이 아니라 단지 하나의 문자열 (13 자의 배열)입니다. 다음 중 하나로 정의 된 경우 동일한 결과를 얻을 수 있습니다.

>> s = ['MAT','LAB ','is f','u','n'];
>> s = ['M','A','T','L','A','B,' ','i','s',' ','f','u','n'];

일반적인 MATLAB 벡터는 다른 클래스 또는 몇 개의 다른 문자열의 변수를 혼합하여 저장할 수 없습니다. 이것은 cell 배열이 유용 할 수있는 곳입니다. 이것은 각각의 MATLAB 객체를 포함 할 수있는 셀의 배열입니다.이 클래스의 클래스는 필요한 경우 모든 셀에서 다를 수 있습니다. 요소 주위에 중괄호 {} 를 사용하여 셀 배열에 저장합니다.

>> C = {A; s}
C = 
    [2x5 double]
    'MATLAB is fun'
>> whos C
  Name      Size            Bytes  Class    Attributes

  C         2x1               330  cell 

모든 클래스의 표준 MATLAB 객체는 셀 배열에 함께 저장할 수 있습니다. 셀 배열은 내용을 저장하기 위해 더 많은 메모리가 필요합니다.

셀의 내용에 액세스하려면 중괄호 {} 합니다.

>> C{1}
ans =
   1.0e+04 *
    0.0001   -0.0002    0.0003    0.0001    1.5625
    0.0003       Inf       Inf       NaN      -Inf

C(1)C{1} 과 다릅니다. 후자는 셀의 내용을 반환하지만 (예를 들어 클래스가 double 있는 경우) 전자는 C 의 하위 배열 인 셀 배열을 반환합니다. 마찬가지로 D 가 10 by 5 셀 배열이면 D(4:8,1:3) 는 크기가 5 x 3이고 클래스가 cellD 의 하위 배열을 반환합니다. 그리고 구문 C{1:2} 에는 하나의 반환 된 객체가 없지만 나중에 여러 개의 반환 값이있는 MATLAB 함수와 비슷한 2 개의 다른 객체가 반환됩니다.

>> [x,y] = C{1:2}
x =
                         1                        -2                      3.14                       0.8                     15625
          3.14159265358979                       Inf                       Inf                       NaN                      -Inf
y =
MATLAB is fun

스크립트 및 함수

MATLAB 코드는 m- 파일로 저장하여 재사용 할 수 있습니다. m- 파일은 MATLAB과 자동으로 연결되는 .m 확장자를가집니다. m 파일은 스크립트 또는 함수를 포함 할 수 있습니다.

스크립트

스크립트는 미리 정의 된 순서로 일련의 MATLAB 명령을 실행하는 프로그램 파일입니다.

스크립트는 입력을 허용하지 않으며 스크립트는 출력을 반환하지 않습니다. 기능상 스크립트는 MATLAB 명령 창에 직접 명령을 입력하고이를 재생할 수있는 것과 같습니다.

스크립트 예제 :

length = 10;
width = 3;
area = length * width;

이 스크립트는 현재 작업 공간의 length , widtharea 을 값 10 , 330 각각 정의합니다.

앞에서 설명한 것처럼 위의 스크립트는 동일한 명령을 명령 창에 직접 입력하는 것과 기능적으로 동일합니다.

>> length = 10;
>> width = 3;
>> area = length * width;

기능들

함수는 스크립트와 비교할 때 훨씬 더 유연하고 확장 가능합니다. 스크립트와 달리 함수는 입력을 받아들이고 호출자에게 결과를 반환 할 수 있습니다. 함수는 자체 작업 공간을 가지고 있기 때문에 함수의 내부 연산이 호출자의 변수를 변경하지는 않습니다.

모든 함수는 동일한 헤더 형식으로 정의됩니다.

function [output] = myFunctionName(input)

function 키워드는 모든 함수 헤더를 시작합니다. 산출물 목록은 다음과 같습니다. 출력 목록은 쉼표로 구분 된 반환 할 변수 목록 일 수도 있습니다.

function [a, b, c] = myFunctionName(input)

다음은 호출에 사용될 함수의 이름입니다. 이것은 일반적으로 파일 이름과 동일한 이름입니다. 예를 myFunctionName.m 함수는 myFunctionName.m 저장합니다.

함수 이름 다음에 입력 목록이 있습니다. 출력과 마찬가지로 쉼표로 구분 된 목록이 될 수도 있습니다.

function [a, b, c] = myFunctionName(x, y, z)

이전 예제 스크립트를 다음과 같이 재사용 가능한 함수로 다시 작성할 수 있습니다.

function [area] = calcRecArea(length, width)
   area = length * width;
end

다른 함수 나 스크립트 파일에서 함수를 호출 할 수 있습니다. 다음은 위의 함수가 스크립트 파일에서 사용되는 예입니다.

l = 100;
w = 20;
a = calcRecArea(l, w);

이전과 마찬가지로 작업 영역에 l , wa 를 각각 100 , 202000 값으로 만듭니다.

데이터 유형

MATLAB에는 16 가지 기본 데이터 유형 또는 클래스가 있습니다. 각 클래스는 행렬 또는 배열 형식입니다. 함수 핸들을 제외하고이 행렬 또는 배열은 최소 0에서 0 크기이며 어떤 크기의 n 차원 배열로도 확장 될 수 있습니다. 함수 핸들은 항상 스칼라 (1x1)입니다.

MATLAB의 중요한 순간은 기본적으로 타입 선언이나 치수 문을 사용할 필요가 없다는 것입니다. 새로운 변수 MATLAB을 정의하면 자동으로 생성되어 적절한 메모리 공간이 할당됩니다.

예:

a = 123;
b = [1 2 3];
c = '123';

>> whos
  Name      Size            Bytes  Class     Attributes

  a         1x1                 8  double              
  b         1x3                24  double              
  c         1x3                 6  char    

변수가 이미 있으면 MATLAB은 원본 데이터를 새 데이터로 바꾸고 필요한 경우 새 저장 공간을 할당합니다.

기본 데이터 유형

기본 데이터 유형은 numeric, logical , char , cell , struct , tablefunction_handle 입니다.

숫자 데이터 유형 :

  • 부동 소수점 숫자 ( 기본값 )

    MATLAB은 배정 밀도 또는 단 정밀도 형식의 부동 소수점 수를 나타냅니다. 기본값은 배정 밀도이지만 단순한 변환 함수로 임의의 수를 단일 정밀도로 만들 수 있습니다.

    a = 1.23;
    b = single(a);
    
    >> whos
      Name      Size            Bytes  Class     Attributes
    
      a         1x1                 8  double              
      b         1x1                 4  single     
    
  • 정수

    MATLAB은 4 개의 부호가 있고 4 개의 부호없는 정수 클래스를 가지고 있습니다. 부호있는 유형을 사용하면 양수뿐만 아니라 양수로도 작업 할 수 있지만 부호없는 유형의 숫자 ​​범위는 하나의 비트가 숫자의 양수 또는 음수 부호를 지정하는 데 사용되므로 넓은 범위의 숫자를 표현할 수 없습니다. 부호없는 유형은 더 넓은 범위의 숫자를 제공하지만 이러한 숫자는 0 또는 양수일 수 있습니다.

    MATLAB은 정수 데이터에 대해 1, 2, 4 및 8 바이트 저장 공간을 지원합니다. 데이터를 수용 할 수있는 가장 작은 정수 유형을 사용하면 프로그램의 메모리 및 실행 시간을 절약 할 수 있습니다. 예를 들어 값 100을 저장하기 위해 32 비트 정수가 필요하지 않습니다.

    a = int32(100);
    b = int8(100);
    
    >> whos
      Name      Size            Bytes  Class    Attributes
    
      a         1x1                 4  int32              
      b         1x1                 1  int8               
    

    데이터를 정수로 저장하려면 double에서 원하는 정수 유형으로 변환해야합니다. 정수로 변환되는 숫자에 소수 부분이 있으면 MATLAB은 가장 가까운 정수로 반올림됩니다. 분수 부분이 정확히 0.5 이면 두 개의 똑같이 가까운 정수에서 MATLAB은 절대 값이 더 큰 정수를 선택합니다.

    a  = int16(456);
    
  • char

    문자 배열은 MATLAB에서 텍스트 데이터를 저장합니다. 전통적인 프로그래밍 용어와 함께, 문자의 배열 (시퀀스)은 문자열로 정의됩니다. MATLAB의 일반 릴리스에는 명시 적 문자열 유형이 없습니다.

  • 논리 값 : 1 또는 0의 논리 값은 각각 참과 거짓을 나타냅니다. 관계 조건 및 배열 인덱싱에 사용합니다. TRUE 또는 FALSE이기 때문에 크기는 1 바이트입니다.

    a = logical(1);
    
  • 구조. 구조체 배열은 필드 라는 데이터 컨테이너를 사용하여 여러 데이터 형식의 변수를 그룹화하는 데이터 형식입니다. 각 필드는 모든 유형의 데이터를 포함 할 수 있습니다. structName.fieldName 형식의 점 표기법을 사용하여 구조의 데이터에 액세스합니다.

    field1 = 'first';
    field2 = 'second';
    value1 = [1 2 3 4 5];
    value2 = 'sometext';
    s = struct(field1,value1,field2,value2);
    

    value1에 액세스하기 위해 다음 구문은 각각 동일합니다.

    s.first or s.(field1) or s.('first')
    

    우리는 첫 번째 메소드와 함께 존재할 것으로 알려진 필드에 명시 적으로 액세스하거나 두 번째 예에서 필드에 액세스하기 위해 문자열을 전달하거나 문자열을 작성할 수 있습니다. 세 번째 예제는 dot parenthases 표기법이 field1 변수에 저장된 것과 동일한 문자열을 사용한다는 것을 증명합니다.

  • 테이블 변수는 크기와 데이터 유형이 다를 수 있지만 모든 변수의 행 수가 같아야합니다.

    Age = [15 25 54]';
    Height = [176 190 165]';
    Name = {'Mike', 'Pete', 'Steeve'}';
    T = table(Name,Age, Height);
    
  • 세포. 매우 유용한 MATLAB 데이터 유형입니다. 셀 배열은 각 요소가 다른 데이터 유형 및 크기 일 수있는 배열입니다. 원하는대로 데이터 조작을위한 강력한 도구입니다.

    a = { [1 2 3], 56, 'art'};
    

    또는

    a = cell(3);
    
  • 함수 핸들함수에 대한 포인터 (예 : 익명 함수)를 저장합니다. 이 함수를 사용하면 다른 함수에 함수를 전달하거나 main 함수 외부에서 로컬 함수를 호출 할 수 있습니다.

각 데이터 유형 및 내장 데이터 유형 변환 기능 ( str2double , table2cell )을 처리 할 수있는 많은 도구가 있습니다.

추가 데이터 유형

특정 경우에 유용하게 사용할 수있는 몇 가지 추가 데이터 유형이 있습니다. 그들은:

  • 날짜 및 시간 : 날짜, 시간 및 기간을 나타내는 배열입니다. datetime('now')21-Jul-2016 16:30:16 반환합니다.

  • 범주 형 배열 : 개별 범주 집합의 값을 사용하여 데이터를 저장하는 데이터 형식입니다. 숫자가 아닌 데이터를 저장하는 데 유용합니다 (메모리 유효). 테이블에서 행 그룹을 선택하는 데 사용할 수 있습니다.

    a = categorical({'a' 'b' 'c'});
    
  • 지도 컨테이너는 모든 스칼라 숫자 값뿐만 아니라 문자 벡터를 통한 색인 생성 기능이있는 데이터 구조입니다. 맵 요소에 대한 인덱스를 키라고합니다. 이러한 키는 키와 연관된 데이터 값과 함께 맵 내에 저장됩니다.

  • 시계열 은 시간 경과에 따라 순차적으로 샘플링 된 데이터 벡터입니다. timesteps와 연결된 데이터를 저장하는 것이 유용하며 많은 작업 방법이 있습니다.

익명 함수 및 함수 핸들

기초

익명 함수는 MATLAB 언어의 강력한 도구입니다. 로컬로 존재하는 함수, 즉 현재 작업 공간에있는 함수입니다. 그러나 정규 함수처럼 (예 : m 파일에) MATLAB 경로에 존재하지 않습니다. 이것이 작업 공간에서 변수와 같은 이름을 가질 수는 있지만 익명이라고하는 이유입니다.

@ 연산자

익명 함수 및 함수 핸들을 만들려면 @ 연산자를 사용하십시오. 예를 들어 sin 함수 (사인)에 대한 핸들을 만들고이를 f 로 사용하려면 다음과 같이하십시오.

>> f = @sin
f = 
    @sin

이제 fsin 함수의 핸들입니다. 도어 핸들을 (실제 생활에서) 문을 사용하는 것과 마찬가지로 함수 핸들은 함수를 사용하는 방법입니다. f 를 사용하기 위해 인수는 sin 함수 인 것처럼 전달됩니다.

>> f(pi/2)
ans =
     1

fsin 함수가 받아들이는 입력 인수를받습니다. sin 이 0 인 입력 인자를 받아들이는 함수라면 (그렇지 않으면 peaks 함수와 같은 다른 함수 인자가 있습니다 f() 는 입력 인자없이 호출 할 것입니다.

사용자 정의 익명 함수

하나의 변수의 익명 함수

위의 예에서 sin 과 같은 기존 함수에 대한 핸들을 만드는 것은 분명히 유용하지 않습니다. 이 예제에서는 일종의 중복입니다. 그러나 여러 번 반복해야하거나 별도의 함수를 만들 필요가있는 사용자 지정 작업을 수행하는 익명의 함수를 만드는 것이 유용합니다. 하나의 변수를 입력으로 받아들이는 커스텀 익명 함수의 예로, 시그널의 사인과 코사인 제곱을 합합니다.

>> f = @(x) sin(x)+cos(x).^2
f = 
    @(x)sin(x)+cos(x).^2

이제 fx 라는 하나의 입력 인자를받습니다. 이것은 @ 연산자 바로 뒤에 괄호 (...) 사용하여 지정되었습니다. f 이제 x : f(x) 의 익명 함수입니다. x 의 값을 f 로 전달하여 사용됩니다.

>> f(pi)
ans =
    1.0000

값 또는 변수의 벡터도에 전달 될 수 f 그들이 내의 유효한 방식으로 사용되는 것이면, f :

>> f(1:3) % pass a vector to f
ans =
    1.1334    1.0825    1.1212
>> n = 5:7;
>> f(n) % pass n to f
ans =
   -0.8785    0.6425    1.2254

둘 이상의 변수의 익명 함수

동일한 방식으로 하나 이상의 변수를 허용하도록 익명 함수를 만들 수 있습니다. 세 가지 변수를 허용하는 익명 함수의 예는 다음과 같습니다.

>> f = @(x,y,z) x.^2 + y.^2 - z.^2
f = 
    @(x,y,z)x.^2+y.^2-z.^2
>> f(2,3,4)
ans =
    -3

익명 함수 매개 변수화

작업 공간의 변수는 익명 함수의 정의 내에서 사용할 수 있습니다. 이를 매개 변수화라고합니다. 예를 들어 익명 함수에서 상수 c = 2 를 사용하려면 다음을 수행합니다.

>> c = 2;
>> f = @(x) c*x
f = 
    @(x)c*x
>> f(3)
ans =
     6

f(3) 변수 c 를 제공된 x 와 곱하기위한 매개 변수로 사용했습니다. 이 시점에서 c 의 값을 다른 값으로 설정하면 f(3) 이 호출되므로 결과가 달라 지지 않습니다 . c 의 값은 익명 함수 를 생성 할 때의 값입니다.

>> c = 2;
>> f = @(x) c*x;
>> f(3)
ans =
     6
>> c = 3;
>> f(3)
ans =
     6

익명 함수에 대한 입력 인수는 작업 영역 변수를 참조하지 않습니다.

작업 공간에서 변수의 이름을 익명 함수의 입력 인수 중 하나 (즉, @(...) )로 사용하면 해당 변수의 값을 사용 하지 않습니다 . 대신 익명 함수의 범위 내에서 다른 변수로 처리됩니다. 익명 함수는 입력 변수가 기본 작업 영역의 변수를 참조하지 않는 개인 작업 공간을 갖습니다. 메인 작업 공간과 익명 기능의 작업 공간은 서로의 내용을 알지 못합니다. 이것을 설명하기위한 예 :

>> x = 3 % x in main workspace
x =
     3
>> f = @(x) x+1; % here x refers to a private x variable
>> f(5)
ans =
     6
>> x
x =
     3

주 작업 공간의 x 값은 f 사용되지 않습니다. 또한 메인 작업 공간에서 x 는 변경되지 않았습니다. f 의 범위 내에서 @ 연산자 다음의 괄호 사이의 변수 이름은 주 작업 공간 변수와 별개입니다.

익명 함수는 변수에 저장됩니다.

익명 함수 (더 정확하게는 익명 함수를 가리키는 함수 핸들)는 현재 작업 공간의 다른 값과 마찬가지로 저장됩니다. 변수 (앞에서와 마찬가지로), 셀 배열 ( {@(x)x.^2,@(x)x+1} ) 또는 심지어 속성 (예 : 대화식 그래픽의 경우 h.ButtonDownFcn )에서. 즉, 익명의 함수는 다른 값처럼 취급 될 수 있습니다. 변수를 변수에 저장하면 현재 작업 공간에 이름이 지정되며 숫자가있는 변수처럼 변경하고 지울 수 있습니다.

다르게 표현 : 함수 핸들 ( @sin 형식이든 익명의 함수이든)은 숫자 행렬처럼 변수에 저장할 수있는 값입니다.

고급 사용

함수 핸들을 다른 함수에 전달

함수 핸들은 변수처럼 취급되기 때문에 함수 핸들을 입력 인자로 받아들이는 함수에 전달할 수 있습니다.

예 : 함수 핸들과 스칼라 번호를 받아들이는 m- 파일에 함수가 생성됩니다. 그런 다음 3 을 전달하여 함수 핸들을 호출 한 다음 스칼라 숫자를 결과에 추가합니다. 결과가 리턴됩니다.

funHandleDemo.m 내용 :

function y = funHandleDemo(fun,x)
y = fun(3);
y = y + x;

경로의 어딘가에 저장하십시오 (예 : MATLAB의 현재 폴더). 이제 funHandleDemo 는 다음과 같이 사용할 수 있습니다.

>> f = @(x) x^2; % an anonymous function
>> y = funHandleDemo(f,10) % pass f and a scalar to funHandleDemo
y =
    19

다른 기존 함수의 핸들을 funHandleDemo 전달할 수 있습니다.

>> y = funHandleDemo(@sin,-5)
y =
   -4.8589

@sinf = @sin 사용하여 변수에 먼저 저장하지 않고 sin 함수에 빠르게 액세스하는 방법에 f = @sin .

bsxfun , cellfun 및 이와 유사한 함수를 익명 함수와 함께 사용

MATLAB은 익명 함수를 입력으로 받아들이는 내장 함수를 가지고 있습니다. 이것은 최소한의 코드 행을 사용하여 많은 계산을 수행하는 방법입니다. 예를 들어 bsxfun 은 요소 별 이진 연산을 수행합니다. 즉, 두 벡터 또는 행렬에 함수를 요소별로 적용합니다. 일반적으로 이것은 -loops for 사용해야하며, 종종 속도를 미리 지정해야합니다. bsxfun 사용 bsxfun 이 프로세스가 빨라집니다. 다음 예제에서는 tictoc 사용하여 코드 사용 시간을 측정하는 데 사용할 수있는 두 가지 함수를 사용하는 방법을 보여줍니다. 행렬 열 평균과 모든 행렬 요소의 차이를 계산합니다.

A = rand(50); % 50-by-50 matrix of random values between 0 and 1

% method 1: slow and lots of lines of code
tic
meanA = mean(A); % mean of every matrix column: a row vector
% pre-allocate result for speed, remove this for even worse performance
result = zeros(size(A));
for j = 1:size(A,1)
    result(j,:) = A(j,:) - meanA;
end
toc
clear result % make sure method 2 creates its own result

% method 2: fast and only one line of code
tic
result = bsxfun(@minus,A,mean(A));
toc

위의 예제를 실행하면 두 가지 결과가 나타납니다.

Elapsed time is 0.015153 seconds.
Elapsed time is 0.007884 seconds.

이 줄은 tic 함수의 마지막 호출 이후 경과 된 시간을 출력하는 toc 함수에서옵니다.

bsxfun 호출은 첫 번째 입력 인수의 함수를 다른 두 개의 입력 인수에 적용합니다. @minus 는 빼기 기호와 동일한 작업의 긴 이름입니다. 다른 익명 함수 또는 (처리 @ 그것을 받아들이는 한, 지정 된 수있는 다른 기능) A 하고 mean(A) 입력이 의미있는 결과를 생성 할 수있다.

특히 대량의 데이터를 대량으로 사용하는 경우 bsxfun 은 작업 속도를 크게 bsxfun 수 있습니다. MATLAB이나 bsxfun 모르는 사람들을 위해 해석하기가 더 어려울지라도 코드를 더 깔끔하게 bsxfun . (MATLAB R2016a 및 이후 버전에서는 이전에 bsxfun 사용한 많은 연산이 더 이상 필요하지 않으며 A-mean(A) 은 직접 작동하고 경우에 따라 더 빨라질 수도 있습니다.)