Main Content

클래스에 size 및 numel 사용

size 및 numel

size 함수는 배열의 차원을 반환합니다. numel 함수는 배열의 요소 개수를 반환하며, 이는 prod(size(objArray))와 동일합니다. 즉, 배열 차원의 곱입니다.

size 함수와 numel 함수는 사용자 정의 객체로 구성된 배열에서 일관되게 동작합니다. 일반적으로 사용자 정의 클래스에는 size 또는 numel을 오버로드할 필요가 없습니다.

여러 MATLAB® 함수는 sizenumel을 사용하여 작업을 수행합니다. 따라서 클래스에서 이러한 함수 중 하나를 오버로드하는 경우 클래스의 객체가 다른 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 클래스는 괄호 인덱싱을 포함하여 이러한 동작을 정의합니다.

서브클래스가 동작을 상속함

서브클래스가 슈퍼클래스 동작을 명시적으로 재정의하지 않는 한 서브클래스는 슈퍼클래스처럼 동작합니다. 예를 들어, SimpleDoubledouble을 서브클래스화하고 속성을 정의하지 않습니다.

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 함수는 이러한 함수에 의해 반환된 값을 사용합니다. sizenumel의 동작을 변경하는 경우 반환된 값이 클래스의 용도에 적합한지 확인하십시오.

numel 대신 numArgumentsFromSubscript 오버로드하기

클래스가 numArgumentsFromSubscript 메서드를 구현하는 경우 MATLAB은 numel 대신 이 메서드를 호출하여 쉼표로 구분된 목록을 반환하는 인덱싱된 표현식에서 반환된 요소 개수를 확인합니다. 예를 들어, 다음과 같은 표현식이 있습니다.

A(1:2).Prop

subsrefsubsasgn 모두 numArgumentsFromSubscript를 사용합니다.

  • subsrefnumArgumentsFromSubscriptsubsref를 반환하는 예상 출력값의 개수(nargout)를 계산합니다.

  • subsasgnnumArgumentsFromSubscriptsubsasgn을 호출한 결과로 MATLAB이 할당하는 예상 입력값의 개수(nargin)를 계산합니다.

내장 클래스의 서브클래스는 항상 첨자를 사용한 참조의 결과로 스칼라 객체를 반환하고 첨자를 사용한 할당에는 항상 스칼라 객체를 사용합니다.

subsref의 경우 nargout, 또는 subsasgn의 경우 nargin이 특정 값이어야 하는 클래스를 정의하는 경우 numArgumentsFromSubscript를 오버로드하여 해당 값을 반환하도록 합니다.

참고 항목