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

    function p = ndblock(p,block_i,block_data)
% block_len = ndblock(p,ind) calculates length of block
%
% p = ndblock(p,ind,data)
%   Builds grid using block.
%   treats factors referenced by ind as a single block, containing 'data'.  
%   Data values in other factors are reproduced for each row in 'data'.

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



if nargin ==2
    % Checking for replication is too slow for large grids.
    % Now just carry the length of the block in the object
    p = p.blocklen;
    return;
end

if isempty(block_data)
    block_data = zeros(1,length(block_i));
end
if size(block_data,2)~=length(block_i)
    error(message('mbc:cgoppoint:InvalidSize3'));
end
if ~all(ismember(block_i,1:length(p.ptrlist)))
    error(message('mbc:cgoppoint:InvalidIndex15'));
end

factor_i = setdiff(1:length(p.ptrlist),block_i);
f_data = p.data;

if isempty(f_data)
    f_data = get(p,'constant');
end

M = size(f_data,1);
L = size(block_data,1);
new_b_data = repmat(block_data,M,1);   %tile the oppoint data

if L > 1
    newdata = zeros(size(new_b_data,1),size(f_data,2));
    % reproduce these Values to fit the oppoint data between each row
    for i = 1:size(f_data,2)
        newdata(:,i) = reshape( repmat(f_data(:,i)' ,L,1) , L.*M , 1);
    end
else
    newdata = f_data;
end

newdata(:,block_i) = new_b_data(:,1:length(block_i));

p.data = newdata;