www.gusucode.com > mbcexpr 工具箱 matlab 源码程序 > mbcexpr/@cgslparser/lookup2D.m

    function ptr = lookup2D(obj,b,blockname,ptr,Inputs)
%lookup2D parse 2D lookup table
%    ptr = lookup2D(obj,b,blockname,ptr,Inputs)

%  Copyright 2012-2013 The MathWorks, Inc. and Ford Global Technologies, Inc.

breakPoints = cell(1,2);
if isvalid(ptr)
    % existing table being reparsed
    IsNew = false;
    % rename table
    setname(obj,ptr,blockname);
else
    
    switch get(b,'BlockType')
        % try to get table name from block parameter rather than name
        case {'Interpolation_n-D','Lookup_n-D'}
            % table with prelookup
            blockname = mbcGetBlockVarname(b,'Table',blockname);
        otherwise
            blockname = mbcGetBlockVarname(b,'OutputValues',blockname);
    end
    [IsNew,ptr,Inputs] = checkTableReuse(obj,b,blockname,Inputs);
    
    if IsNew
        % make new cglookuptwo
        ptr = cglookuptwo(blockname);
        ptr.info = ptr.set('precision',cgprecfloat);
        
        breakPoints = getBreakpointValues(obj,b,ptr);
    end
end
connectInputs(obj,b,ptr,Inputs,breakPoints);
obj.addToList( ptr, b,IsNew);

function connectInputs(obj,b,ptr,Inputs,breakPoints)
%connectInputs conect table inputs

LT = info(ptr);
% make normalisers for block
if obj.OldTableInputOrder
    % old order 1=X, 2=Y is inconsistent with Simulink/MATLAB
    normX = [getname(ptr.info),'norm_1'];
    normY = [getname(ptr.info),'norm_2'];
    Inputs(1) = createNormaliser(obj,b,Inputs(1),normX, breakPoints{1});
    Inputs(2) = createNormaliser(obj,b,Inputs(2),normY, breakPoints{2});
    LT = setX(LT,ptr,Inputs(1));
    LT = setY(LT,ptr,Inputs(2));
else
    % new order 1=Y, 2=X is consistent with Simulink/MATLAB
    [normX,normY]=getNormaliserNames(ptr,b);
    Inputs(1) = createNormaliser(obj,b,Inputs(1),normY, breakPoints{1});
    Inputs(2) = createNormaliser(obj,b,Inputs(2),normX, breakPoints{2});
    LT = setX(LT,ptr,Inputs(2));
    LT = setY(LT,ptr,Inputs(1));
end
ptr.info = LT;

function breakPoints = getBreakpointValues(obj,b,ptr)
% get table values from blocks

breakPoints = cell(1,2);

switch get(b,'BlockType')
    case 'Lookup_n-D'
        values = mbcGetBlockValue(b,'Table');
        breakPoints= {mbcGetBlockValue(b,'BreakpointsForDimension1')
            mbcGetBlockValue(b,'BreakpointsForDimension2')};
    case 'Interpolation_n-D'
        % table with prelookup
        values = mbcGetBlockValue(b,'Table');
    otherwise
        % other tables
        breakPoints= {mbcGetBlockValue(b,'RowIndex')
            mbcGetBlockValue(b,'ColumnIndex')};
        values = mbcGetBlockValue(b,'OutputValues');
end
if ~isempty(values)
    if obj.OldTableInputOrder
        % table input order was flipped pre-2013a
        values = values';
    end
    ptr.info = ptr.set('matrix',{values,sprintf('Values imported from Simulink model %s',get(bdroot(b),'Name'))});
end

function [normX,normY]=getNormaliserNames(ptr,b)

normX = [getname(ptr.info),'_normX'];
normY = [getname(ptr.info),'_normY'];
switch get(b,'BlockType')
    % try to read normaliser name from block parameter - the name must be a proper variable name
    case 'Lookup_n-D'
        normX = mbcGetBlockVarname(b,'BreakpointsForDimension2',normX);
        normY = mbcGetBlockVarname(b,'BreakpointsForDimension1',normY);
    otherwise
        normX = mbcGetBlockVarname(b,'ColumnIndex',normX);
        normY = mbcGetBlockVarname(b,'RowIndex',normY);
end