exponenta event banner

setMapData

Назначение данных слоям карты

Описание

пример

setMapData(map,layername,layerinputs) принимает layerinputs аргументы и передает их setMapData для указанного имени слоя карты. Чтобы указать отдельные ячейки или блоки данных в мире, локальных координатах или координатах сетки, см. синтаксы setMapData.

inBounds = setMapData(map,layername,layerinputs) возвращает массив значений для заданных расположений в layerinputs входной аргумент.

Примеры

свернуть все

multiLayerMap позволяет группировать несколько слоев карты и определять поведение этих слоев при настройке и получении данных. С помощью отдельных слоев карты можно сохранять различные данные карты и задавать различные варианты поведения для каждого из них. Можно также определить SetTransformFcn и GetTransformFcn дескрипторы функций для слоя карты, так что зависимости создаются между слоями. В этом примере показано, как хранить данные на уровне карты и реализовывать прослушиватели событий, которые обновляют другие карты. В этих картах хранится количество обновлений или обращений к данным.

Зависимые слои

Создайте два независимых слоя карты.

mapAccessed = mapLayer(zeros(10,10),'LayerName','GetListener');
mapModified = mapLayer(zeros(10,10),'LayerName','SetListener');

Укажите дескрипторы функций для функций get и set transform, используемых в основном слое карты. Эти функции увеличивают значение местоположения сетки при получении или установке данных карты на входной карте. mainMap. См. раздел Дескрипторы функций прослушивателя для реализации функции.

setHookFcn = @(mainMap,values,varargin)exampleHelperSetHookFcn(mapModified,mainMap,values,varargin{:});
getHookFcn = @(mainMap,values,varargin)exampleHelperGetHookFcn(mapAccessed,mainMap,values,varargin{:});

Создайте главный слой карты со значениями по умолчанию 0,5. Укажите дескрипторы функций для создания зависимостей слоев.

map = mapLayer(repmat(0.5,10,10),...
                'GetTransformFcn',getHookFcn,...
                'SetTransformFcn',setHookFcn);

Добавление всех карт к одному и тому же multiLayerMap объект.

mapLayers = multiLayerMap({map,mapAccessed,mapModified});

Установите (0,0) местоположение карты со значением нуля, используя setMapData объектная функция map.

setMapData(map,[0 0],0)

Проверьте, что mapModified увеличили их значение.

getMapData(mapModified,[0 0])
ans = 1

Получите только что установленные данные на уровне основной карты. Возвращается ожидаемое значение, равное нулю.

getMapData(map,[0 0])
ans = 0

Проверьте, что mapAccessed увеличили их значение.

getMapData(mapAccessed,[0 0])
ans = 1

Обновите всю карту с помощью матрицы значений. Также получите доступ к данным.

setMapData(map,rand(10,10))
getMapData(map)
ans = 10×10

    0.6443    0.2077    0.3111    0.5949    0.0855    0.9631    0.0377    0.1068    0.0305    0.1829
    0.3786    0.3012    0.9234    0.2622    0.2625    0.5468    0.8852    0.6538    0.7441    0.2399
    0.8116    0.4709    0.4302    0.6028    0.8010    0.5211    0.9133    0.4942    0.5000    0.8865
    0.5328    0.2305    0.1848    0.7112    0.0292    0.2316    0.7962    0.7791    0.4799    0.0287
    0.3507    0.8443    0.9049    0.2217    0.9289    0.4889    0.0987    0.7150    0.9047    0.4899
    0.9390    0.1948    0.9797    0.1174    0.7303    0.6241    0.2619    0.9037    0.6099    0.1679
    0.8759    0.2259    0.4389    0.2967    0.4886    0.6791    0.3354    0.8909    0.6177    0.9787
    0.5502    0.1707    0.1111    0.3188    0.5785    0.3955    0.6797    0.3342    0.8594    0.7127
    0.6225    0.2277    0.2581    0.4242    0.2373    0.3674    0.1366    0.6987    0.8055    0.5005
    0.5870    0.4357    0.4087    0.5079    0.4588    0.9880    0.7212    0.1978    0.5767    0.4711

Проверьте, что mapModified и mapAccessed увеличили их значения.

getMapData(mapModified)
ans = 10×10

     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     2     1     1     1     1     1     1     1     1     1

getMapData(mapAccessed)
ans = 10×10

     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     2     1     1     1     1     1     1     1     1     1

Нижнее левое расположение возвращает два, а все остальные значения равны одному. Это подтверждает, что функции прослушивателя работают по назначению.

Дескрипторы функций прослушивателя

Эти функции реализуют вспомогательные функции get и set example, которые обновляют другие слои карты.

function valuesOut = exampleHelperSetHookFcn(modifiedMap,sourceLayer,valueIn,varargin)
    % Pass output through
    valuesOut = valueIn;
    
    % If no additional inputs are passed, return immediately.
    if numel(varargin) == 0
        return;
    else
        % Otherwise, increment the value in the modifiedMap.
        if numel(varargin) == 1
            currentValue = getMapData(modifiedMap);
            setMapData(modifiedMap,currentValue+1);
        else        
            currentValue = getMapData(modifiedMap,varargin{1},varargin{3:end});
            % setMapData syntax <<<<>>>>
            setMapData(modifiedMap,varargin{1},currentValue+1,varargin{3:end});
        end
    end
end

function data = exampleHelperGetHookFcn(accessedMap,sourceLayer,valuesIn,varargin)
    
    data = valuesIn;

    % If no additional inputs are passed, check if the values in
    if numel(varargin) == 0
        if isequal(size(valuesIn),sourceLayer.DataSize)
            % Increment the depedent map.
            currentValue = getMapData(accessedMap);
            setMapData(accessedMap,currentValue+1);
        end
    else
        currentValue = getMapData(accessedMap,varargin{:});
        setMapData(accessedMap,varargin{1},currentValue+1,varargin{3:end});
    end
end

Входные аргументы

свернуть все

Многослойная карта, заданная как multiLayerMap объект.

Имя слоя сопоставления, указанное как строковый скалярный или символьный массив. Слои карты имеют указанное имя при создании multiLayerMap объект.

Входные данные переменной длины для setMapData функция слоя карты, указанная как varargin. Чтобы указать отдельные ячейки или блоки данных в мире, локальных координатах или координатах сетки, см. синтаксы setMapData.

Выходные аргументы

свернуть все

Допустимые расположения карт, возвращаемые в виде вектора столбца n-by-1, равного по длине xy или ij. Расположение внутри границ карты возвращает значение 1. Местоположения за пределами границ карты возвращают значение 0.

Расширенные возможности

Создание кода C/C + +
Создайте код C и C++ с помощью MATLAB ® Coder™

.

См. также

Объекты

Функции

Представлен в R2021a