클래스에 size 및 numel 사용
size 및 numel
size
함수는 배열의 차원을 반환합니다. numel
함수는 배열의 요소 개수를 반환하며, 이는 prod(size(objArray))
와 동일합니다. 즉, 배열 차원의 곱입니다.
size
함수와 numel
함수는 사용자 정의 객체로 구성된 배열에서 일관되게 동작합니다. 일반적으로 사용자 정의 클래스에는 size
또는 numel
을 오버로드할 필요가 없습니다.
여러 MATLAB® 함수는 size
와 numel
을 사용하여 작업을 수행합니다. 따라서 클래스에서 이러한 함수 중 하나를 오버로드하는 경우 클래스의 객체가 다른 MATLAB 함수와 함께 설계된 대로 동작하는지 확인하십시오.
클래스가 배열 인덱싱을 수정하는 경우 numel 대신 numArgumentsFromSubscript 오버로드하기 항목을 참조하십시오.
내장 클래스 동작
내장 클래스에서 파생된 클래스에서 size
함수와 numel
함수를 사용하면 이러한 함수는 슈퍼클래스에서와 똑같이 동작합니다.
내장 클래스 double
이 있다고 가정하겠습니다.
d = 1:10; size(d)
ans = 1 10
numel(d)
ans = 10
dsub = d(7:end); size(dsub)
ans = 1 4
double
클래스는 괄호 인덱싱을 포함하여 이러한 동작을 정의합니다.
서브클래스가 동작을 상속함
서브클래스가 슈퍼클래스 동작을 명시적으로 재정의하지 않는 한 서브클래스는 슈퍼클래스처럼 동작합니다. 예를 들어, SimpleDouble
은 double
을 서브클래스화하고 속성을 정의하지 않습니다.
classdef SimpleDouble < double methods function obj = SimpleDouble(data) if nargin == 0 data = 0; end obj = obj@double(data); end end end
객체를 만들고 값 1:10
을 할당합니다.
sd = SimpleDouble(1:10);
size
함수는 슈퍼클래스 부분의 크기를 반환합니다.
size(sd)
ans = 1 10
numel
함수는 슈퍼클래스 부분의 요소 개수를 반환합니다.
numel(sd)
ans = 10
객체 배열은 슈퍼클래스 배열의 크기를 반환합니다.
size([sd;sd])
ans = 2 10
numel([sd;sd])
ans = 20
SimpleDouble
클래스는 double
클래스의 인덱싱 동작을 상속합니다.
sdsub = sd(7:end); size(sdsub)
ans = 1 4
내장 클래스에서 파생되지 않은 클래스
간단한 값 클래스가 있다고 가정하겠습니다. 이 클래스는 double
클래스의 배열과 유사한 동작을 상속하지 않습니다. 예를 들어, 다음과 같습니다.
classdef VerySimpleClass properties Value end end
객체를 만들고 요소를 10개 가진 배열을 Value
속성에 할당합니다.
vs = VerySimpleClass; vs.Value = 1:10; size(vs)
ans = 1 1
numel(vs)
ans = 1
size([vs;vs])
ans = 2 1
numel([vs;vs])
ans = 2
vs
는 스칼라 객체입니다. Value
속성은 doubles
형으로 구성된 배열입니다.
size(vs.Value)
ans = 1 10
객체 속성에 인덱싱 표현식을 적용합니다.
vssub = vs.Value(7:end); size(vssub)
ans = 1 4
vs.Value
속성은 클래스가 double
인 배열입니다.
class(vs.Value)
ans = double
VerySimpleClass
객체로 구성된 배열을 생성합니다.
vsArray(1:10) = VerySimpleClass;
배열 요소 2부터 10까지에 대한 Value
속성이 비어 있습니다.
isempty([vsArray(2:10).Value])
ans = 1
MATLAB은 객체 배열 속성값 할당에 스칼라 확장을 적용하지 않습니다. 이를 위해 deal
함수를 사용하십시오.
[vsArray.Value] = deal(1:10); isempty([vsArray.Value])
ans = 0
deal 함수는 vsArray
객체 배열의 각 Value
속성에 값을 할당합니다.
객체 배열의 인덱싱 규칙은 struct
배열의 규칙과 동일합니다.
vsArray(1).Value
ans = 1 2 3 4 5 6 7 8 9 10
vsArray(1).Value(6)
ans = 6
size 또는 numel 동작 변경하기
내장 숫자형 클래스의 서브클래스는 size
메서드를 상속하는데, 이는 서브클래스 객체의 슈퍼클래스 부분에서 동작을 수행합니다(이러한 메서드는 숨겨져 있음). size
또는 numel
이 다르게 동작하도록 만들려면 서브클래스에서 size
또는 numel
메서드를 정의하여 이를 재정의하십시오.
다른 MATLAB 함수는 이러한 함수에 의해 반환된 값을 사용합니다. size
와 numel
의 동작을 변경하는 경우 반환된 값이 클래스의 용도에 적합한지 확인하십시오.
numel 대신 numArgumentsFromSubscript 오버로드하기
클래스가 numArgumentsFromSubscript
메서드를 구현하는 경우 MATLAB은 numel
대신 이 메서드를 호출하여 쉼표로 구분된 목록을 반환하는 인덱싱된 표현식에서 반환된 요소 개수를 확인합니다. 예를 들어, 다음과 같은 표현식이 있습니다.
A(1:2).Prop
subsref
와 subsasgn
모두 numArgumentsFromSubscript
를 사용합니다.
내장 클래스의 서브클래스는 항상 첨자를 사용한 참조의 결과로 스칼라 객체를 반환하고 첨자를 사용한 할당에는 항상 스칼라 객체를 사용합니다.
subsref
의 경우 nargout
, 또는 subsasgn
의 경우 nargin
이 특정 값이어야 하는 클래스를 정의하는 경우 numArgumentsFromSubscript
를 오버로드하여 해당 값을 반환하도록 합니다.