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