matlab.mixin.indexing.RedefinesBrace class

Пакет: matlab.mixin.indexing

Настройте операции индексации класса то использование фигурные скобки

Описание

matlab.mixin.indexing.RedefinesBrace класс является абстрактным суперклассом, который позволяет вам настроить, как индексирующие операции с фигурными скобками ведут себя. RedefinesParen и RedefinesDot позвольте вам настроить операции индексации с круглыми скобками и точками. Можно наследоваться этим классам индивидуально, настроив один аспект поведения, не влияя на поведение по умолчанию других операций индексации.

Чтобы настроить как ваши операции индексации указателей класса с фигурными скобками, наследуйтесь RedefinesBrace и реализация его абстрактные методы:

  • braceAssign

  • braceListlength

  • braceReference

Атрибуты класса

Abstract
true
HandleCompatible
true

Для получения информации об атрибутах класса см. Атрибуты класса.

Методы

развернуть все

Примеры

свернуть все

В этом примере показано, как настроить индексацию фигурной скобки в ArrayofArrays класс. ArrayOfArrays реализует 1 n массив массивов. Содержавшие массивы могут иметь различные классы, формы и размеры. Класс наследовался обоим matlab.mixin.indexing.RedefinesBrace и matlab.mixin.indexing.RedefinesParen. Фигурная скобка, индексирующая индивидуальную настройку, обрабатывает ссылки и присвоения на содержавшие массивы:

  • braceReference: Указатели заключают в фигурные скобки ссылки в Arrays свойство класса. Например, синтаксис instanceidx } получает доступ к содержавшему массиву в индексе idx в Arrays.

  • braceAssign: Указатели заключают в фигурные скобки присвоения в Arrays свойство. Например, синтаксис instanceidx } = A присваивает значение A к содержавшему массиву в индексе idx в Arrays. Если idx превышает текущее число элементов в Arrays, braceAssign создает элемент и присваивает A к нему.

  • braceListLength: Определяет количество значений, чтобы возвратиться из выражений индексации фигурной скобки, которые возвращают список, разделенный запятыми.

ArrayOfArrays также наследовался RedefinesParen поддерживать круглые скобки, индексирующие в некотором роде похожий на массивы ячеек. Например, синтаксис instance1(idx1) = instance2(idx2) присваивает содержавший массив в instance2 в idx2 к idx1 в instance1. Чтобы видеть полный список абстрактных методов, которые должны быть реализованы при настройке индексации круглых скобок, смотрите matlab.mixin.indexing.RedefinesParen.

Определение класса ArrayOfArrays также включает две функции обработки ошибок:

  • ErrorForUnsupportedIndexing: Предотвращает любую дополнительную индексацию после индексации круглых скобок в операций присвоения и ссылке.

  • ErrorForUnexpectedRightHandSide: Ограничивает присвоения круглых скобок на случаи, когда правой стороной оператора является ArrayofArrays экземпляр.

Код для ArrayOfArrays Класс и функции обработки ошибок

classdef ArrayOfArrays < matlab.mixin.indexing.RedefinesParen & ...
        matlab.mixin.indexing.RedefinesBrace
   
    properties (Access=private)
        Arrays (1,:) cell
    end

    methods (Access=protected)
        function varargout = braceReference(obj,indexOp)
            [varargout{1:nargout}] = obj.Arrays.(indexOp);
        end

        function obj = braceAssign(obj,indexOp,varargin)
            if isscalar(indexOp)
                [obj.Arrays.(indexOp)] = varargin{:};
                return;
            end
            [obj.Arrays.(indexOp)] = varargin{:};
        end

        function n = braceListLength(obj,indexOp,indexContext)
            n = listLength(obj.Arrays,indexOp,indexContext);
        end

        function out = parenReference(obj,indexOp)
            ErrorForUnsupportedIndexing(indexOp);
            out = obj;
            out.Arrays = obj.Arrays.(indexOp);
        end

        function obj = parenAssign(obj,indexOp,in)
            ErrorForUnsupportedIndexing(indexOp);
            ErrorForUnexpectedRightHandSide(in);
            obj.Arrays.(indexOp) = in.Arrays;
        end

        function n = parenListLength(~,~,~)
            n = 1;
        end

        function obj = parenDelete(obj,indexOp)
            obj.Arrays.(indexOp) = [];        
        end
    end

    methods (Access=public)
        function obj = ArrayOfArrays(varargin)
            if nargin > 0
                obj.Arrays = varargin;
            else
                obj.Arrays = [];
            end
        end

        function out = cat(~,varargin)
            out = ArrayOfArrays;
            for ix = 1:length(varargin)
                tmp = varargin{ix};
                if isa(tmp,'ArrayOfArrays')
                    out.Arrays = [out.Arrays,tmp.Arrays];
                else
                    out.Arrays{end+1} = tmp;
                end
            end
        end

        function varargout = size(obj,varargin)
            [varargout{1:nargout}] = size(obj.Arrays,varargin{:});
        end
    end
    
    methods (Static)
        function out = empty()
            out = ArrayOfArrays();
        end
    end
end

function ErrorForUnsupportedIndexing(indexOp)
    if ~isscalar(indexOp)
        error('Indexing after parentheses indexing is not supported.');
    end
end

function ErrorForUnexpectedRightHandSide(val)
    if ~isa(val,'ArrayOfArrays')
        error(['Parentheses assignment is only supported when the ' ...
            'right-hand side is an ArrayOfArrays.']);
    end
end

Используйте ArrayOfArrays Экземпляр

Создайте ArrayOfArrays экземпляр с двумя содержавшими массивами, вектором с 2 элементами и 3х3 матрицей.

myArrays = ArrayOfArrays([1 2],2*eye(3));

Используйте индексацию фигурной скобки, чтобы просмотреть второй содержавший массив. braceReference метод принимает IndexingOperation объект, который идентифицирует что поле для доступа.

myArrays{2}
ans = 3×3

     2     0     0
     0     2     0
     0     0     2

Используйте фигурную скобку и индексацию круглых скобок, чтобы извлечь верхний правый угол матрицы во втором массиве. Класс вызывает braceReference метод, чтобы получить доступ к содержавшему массиву в индексе 2 и затем вперед индексации круглых скобок к самой матрице.

myArrays{2}(1:2,2:3)
ans = 2×2

     0     0
     2     0

Добавьте третий элемент в экземпляр с помощью присвоения фигурной скобки. braceAssign метод принимает IndexingOperation объект, который описывает тип индексации операции (Brace) и индексы сослались, и второй аргумент, который содержит значение, которое будет присвоено, в этом случае массив ячеек. Проверьте сложение.

myArrays{3} = {1:5,6:10};
myArrays{3}
ans=1×2 cell array
    {[1 2 3 4 5]}    {[6 7 8 9 10]}

Присвойте несколько новых значений myArrays{3}. Поскольку присвоение включает несколько значений, MATLAB вызывает braceListLength метод, чтобы определить, сколько элементов должно быть присвоено прежде, чем вызвать braceAssign обрабатывать операцию присвоения.

[myArrays{3}{:}] = deal(5);
myArrays{3}
ans=1×2 cell array
    {[5]}    {[5]}

Индивидуально настраиваемая индексация круглых скобок, реализованная классом, включает ссылки круглых скобок и присвоение похожим способом к тому, как эта индексация работает в массивах ячеек. Присвойте содержавшие массивы в индексах 1 и 2 myArrays к новому ArrayOfArrays экземпляр, x. Класс вызывает parenAssign выполнять операцию. Используйте индексацию фигурной скобки, чтобы проверить содержимое x.

x = myArrays(1:2);
x{1:2}
ans = 1×2

     1     2

ans = 3×3

     2     0     0
     0     2     0
     0     0     2

Введенный в R2021b
Для просмотра документации необходимо авторизоваться на сайте