www.gusucode.com > mbcdata 工具箱 matlab 源码程序 > mbcdata/@cgoppoint/AddExpr.m

    function [op,fact_i,mess] = AddExpr(op,ptrs,doEval)
%ADDEXPR Add a new cgexpr object to the oppoint
% op = AddExpr(op,ptrs) adds expressions given by ptrs.
%    Checking performed on ptr and expression types; special cases
%    (eg subfeatures) handled.
% [op,index,mess] returns indices of added factors.

%  Copyright 2000-2006 The MathWorks, Inc. and Ford Global Technologies, Inc.


mess = '';
fact_i = [];

if nargin<3
    doEval= true;
end

% check for subfeatures etc.
[ptrs,linkptrs,names,units,cr_flag,value_ind] = ExpandPtrs(op,ptrs);
orig_names = names;
orig_names(~isvalid(linkptrs)) = {[]};

% filter out any ptrs already in dataset
% also filter out any invalid ptrs.
keep = find(~ismember(double(ptrs),double(op.ptrlist)) & reshape(isvalid(ptrs),size(ptrs)));
ptrs = ptrs(keep);
linkptrs = linkptrs(keep);
orig_names = orig_names(keep);
cr_flag = cr_flag(keep);
value_ind = value_ind(keep);
units = units(keep);

% values become inputs, and overwrite.
overwrite = value_ind;
ftype = 2-(value_ind);
% default to constant.
grid_flag = zeros(1,length(ptrs));

nptrs= length(ptrs);
evalptrs= null(xregpointer, 1, length(ptrs));
% Get some data for each new ptr
for i = 1:nptrs
    % For linked ptrs (ie features) work out correct evalptr
    if isvalid(linkptrs(i))
        evalptr = linkptrs(i);
    else
        evalptr = ptrs(i);
    end
    evalptrs(i)= evalptr;
    % Check evaluation
end

if nptrs>0
    % Do all checks at once
    ch = false( size( value_ind ) );
    ch(~value_ind) = check_eval(op,evalptrs(~value_ind) );
    ToEvalIdx = find(ch);
    npts = get(op ,'numpoints');
    data = zeros(npts, nptrs);
    if ~isempty(ToEvalIdx) && (npts~=0)
        for n = ToEvalIdx
            data(:, n) = i_eval(op,ptrs(n));
        end
    end
    
    % Try to set values to set point
    ToValInd = find(value_ind);
    constant = zeros(1,  nptrs);
    if ~isempty(ToValInd)
        for n = ToValInd
            constant(n) = ptrs(n).getnomvalue;
            data(:, n) = constant(n);
        end
    end
    

    % now add the factors and set various flags
    of = length(op.ptrlist);
    op = addfactor(op,ptrs,...
        'factor_type',ftype,'tolerance',0,'data',data,...
        'grid_flag',grid_flag,'overwrite',overwrite,...
        'linkptr',linkptrs,'orig_name',orig_names,...
        'created_flag',cr_flag,'units',units, ...
        'constant', constant);
    nf = length(op.ptrlist);
    fact_i = of+1:nf;
    % Sort out groups
    op = CheckGroup(op,doEval);

end