할당이란 변수에 새 값을 담는 표현식을 말합니다. 아래 예시는 값 1을 변수 z
에 할당합니다.
z = 1
위 표현식을 실행하면, 변수 z
가 값 1을 갖습니다. 할당되기 이전의 z
의 옛 값은 어떤
값이었던지 간에 잊힙니다. ‘=’ 기호를 할당 연산자라고 합니다.
할당으로 문자열도 담습니다. 아래 예시 표현식이 변수 message
에 값 "this food is good"
을
담습니다.
thing = "food" predicate = "good" message = [ "this " , thing , " is " , predicate ]
(또한 문자열 접합도 보여줍니다.)
연산자 대부분(덧셈, 붙이기 등등) 값 연산 외에는 다른 역할이 없습니다. 값이 필요 없으면, 이들 연산자를 사용하지 않아도 됩니다. 할당 연산자는 다릅니다. 할당 연산자는 값을 만들고, 값이 필요 없더라도, 변수 수정으로 존재감을 내비칩니다. 이를 부작용이라고 합니다.
할당식의 좌항이 꼭 변수일 필요는 없습니다.(변수 참고) 행렬의 원소도 가능하고(색인 표현식 참고), 반환값 목록도 가능합니다.(함수 호출 참고) 이들 모두를 할당 연산자의 왼쪽에 나타난다고 하여 좌항 값이라고 합니다. 우항에는 모든 표현식이 가능합니다. 우항의 표현식이 주어진 변수, 행렬 원소, 반환값 목록에 할당하여 담을 새 값을 만듭니다.
변수는 영구적이지 않다는 점이 중요합니다. 단순하게 말하면 변수형은 변수가 어떤 값을 담고 있느냐에 따라 정하여집니다.
아래 풀그림 부분에서 변수
foo
는 처음에는 수치 값을 가졌다가 문자열 값을 가집니다.
octave:13> foo = 1 foo = 1 octave:13> foo = "bar" foo = bar
두 번째 할당이 foo
에 문자열 값을 주는 순간, foo
가 직전에 가지고 있던 값은
잊힙니다.
행렬을 색인하여 스칼라를 할당하면, 색인한 모든 행렬 원소를 준 스칼라 값으로 설정합니다. 예를 들어,
a
가 적어도 열이 두 개인 행렬이라 치면,
a(:, 2) = 5
a
의 두 번째 열에 있는 모든 원소를 5로 설정합니다.
빈 행렬 ‘[]’ 할당은 주로 행렬의 행·열, 벡터를 지우는 데에 사용합니다. 빈 행렬을 참고하십시오. 예를 들어, 4×5짜리 행렬 A가 있다고 할 때, 아래 할당이
A (3, :) = []
A의 세 번째 행을 지우며, 아래 할당이
A (:, 1:2:5) = []
첫 번째, 세 번째, 다섯 번째 열을 지웁니다.
할당식도 표현식이기 때문에 값이 있습니다. z = 1
은 표현식으로서 값 1을 가집니다. 이 결과로
인하여 아래처럼 할당을 여러 번 같이 할 수 있습니다.
x = y = z = 0
값 0을 세 변수에 넣습니다. 이는 z = 0
의 값인 0이 y
에 담기어, y = z = 0
가
되고, 이의 값 0이 x
에 담기기 때문입니다.
변수 목록에 할당을 하여도 되며, 그래서 아래 표현식이 올바릅니다.
[a, b, c] = [u, s, v] = svd (a)
위 표현식은 아래와 완벽하게 같습니다.
[u, s, v] = svd (a) a = u b = s c = v
위 표현식과 비슷하게, 각 항의 값 개수는 서로 맞지 않아도 됩니다. 예를 들어, 표현식
[a, b] = [u, s, v] = svd (a)
은 아래 표현식과 같습니다.
[u, s, v] = svd (a) a = u b = s
그러나 표현식 좌항의 값 개수는 우항의 값 개수를 넘어서면 안됩니다. 예를 들어, 아래 표현식에서는 오류가 발생합니다.
[a, b, c, d] = [u, s, v] = svd (a); -| 오류: 4번째 원소를 반환값이 정의하지 않았습니다.
상징 ~
은 좌항 값에서 대응하는 반환값을 무시하고 담지 않겠다는 의미인 빠짐표로 사용합니다.
[~, s, v] = svd (a);
위가 허수아비 변수를 사용하는 것보다 더 깔끔하고 막기억장치 용량도 덜 먹습니다. 우항 표현식의 nargout
값은 아무 효과도
없습니다. 할당식을 표현식처럼 사용하면, 반환 값은 무시한 값이 빠진 반점 분리 목록입니다.
매우 보편적인 풀그림 짜기 방식이 아래처럼 존재하는 변수에 값을 주어 더하는 것입니다.
a = a + 2;
위는
+=
연산자를 사용하여 더 명료하고 간결하게 표현할 수 있습니다.
a += 2;
이미 존재하는 변수에 사용하는 비슷한 연산자로는 뺄셈(-=
),
곱셈(*=
), 나눗셈(/=
)이 있습니다. 이 형식은
표현식1 연산자= 표현식2
아래와 같이 평가합니다.
표현식1 = (표현식1) 연산자 (표현식2)
표현식2가 부작용 없는 단순한 표현식이기만 하면, 연산자는 +
, -
, *
, /
입니다.
표현식2도 할당 연산자를 포함하는 경우에는 아래처럼 평가합니다.
임시 = 표현식2 표현식1 = (표현식1) 연산자 임시
임시는 표현식2의 연산 값을 잠시 저장하는 곳입니다. 그래서 표현식을
a *= b+1
아래처럼 계산하며,
a = a * (b+1)
아래처럼 하지는 않습니다.
a = a * b + 1
할당식을 표현식 어느 곳에나 사용할 수 있습니다. 예를 들어, y
에 1을 넣고, x
가 1과
같은지 검사하기 위하여 x != (y = 1)
라고 적어도 적합합니다. 그러나 이런 꼴은 풀그림을 읽기 어렵게 합니다.
일회성 풀그림을 제외하고는 이런 안겨있는 형태의 할당을 없애야 합니다. 없애는 작업은 전혀 어렵지 않습니다.