在MATLAB中扩展拉丁超立方点

时间:2015-03-17 08:44:21

标签: matlab

我想知道创建LHS设计的命令是什么,如果模型不够好,那么稍后用更多的点来增加它?例如,我将首先创建一个50点LHS设计,然后逐步添加更多点(可能是20个批次),直到模型足够准确。 例如:

Set1=lhsdesign(5,5); %5x5 matrix
%Use of set 1, then determine more points are needed 
Set2=%some command that adds 20 points to Set1 to make it a 25x5 matrix

为20个新点再次运行lhsdesign的难度没有考虑到原始点。还有使用原始点完成的工作,因此通过从头开始生成一组新的点浪费这项工作,因为新点不包括在新集中。

1 个答案:

答案 0 :(得分:0)

我能够创建一个解决这个问题的函数。我不确定最终矩阵是否是真正的拉丁超立方体,但是如果需要,它会将所需的点数添加到给定点并将它们移动到最近的可用开放“通道”(没有点存在的子范围)。

用法如下:

x1=lhsdesign(200,17);
xF=lhsaugment(x1,200);

其中x1组点数增加了200个点,导致xF为400x17矩阵。功能如下:

function xF = lhsaugment(x1,nPoi)
%function xF = lhsaugment(x1,nPoi)
%Function to augment a given latin hypercube x1 by a number of points,
%nPoi. Only the length is changed, i.e. points are added to the length.
%The original points are left unctouched and appear first in the output
%xF. Thus the size of xF is [size(x1,1)+nPoi size(x1,2)].
x2=lhsdesign(nPoi,size(x1,2));
nPoi=size(x2,1);
oPoi=size(x1,1);
tPoi=nPoi+oPoi;
fInt=1/tPoi;
for i=1:tPoi
    cBound(i,:)=[(i-1)*fInt i*fInt];
end
xF=zeros(tPoi,size(x1,2));
bX1=zeros(size(x1));
bX2=zeros(size(x2));
bF=zeros(tPoi,size(x1,2));
iF=zeros(1,size(x1,2));
iMove=0;
for i=1:oPoi
    for j=1:size(cBound,1)
        for l=1:size(x1,2)
            if (x1(i,l)>cBound(j,1))&&(x1(i,l)<=cBound(j,2))&&(bF(j,l)==0)
                iF(1,l)=iF(1,l)+1;
                xF(iF(1,l),l)=x1(i,l);
                bX1(i,l)=1;
                bF(j,l)=1;
            elseif (x1(i,l)>cBound(j,1))&&(x1(i,l)<=cBound(j,2))&&(bF(j,l)~=0)
                iMin=size(cBound,1);
                pMin=size(cBound,1);
                for m=j:-1:1
                    if (bF(m,l)==0)
                        iMin=m;
                        pMin=j-m;
                        break
                    end
                end
                for m=j:size(cBound,1)
                    if (bF(m,l)==0)&&(m-j<pMin)
                        iMin=m;
                        pMin=j+m;
                        break
                    end
                end
                iF(1,l)=iF(1,l)+1;
                xF(iF(1,l),l)=x1(i,l);
                bX1(i,l)=1;
                bF(iMin,l)=1;
            end
        end
    end
end
for i=1:nPoi
    for j=1:size(cBound,1)
        for l=1:size(x2,2)
            if (x2(i,l)>cBound(j,1))&&(x2(i,l)<=cBound(j,2))&&(bF(j,l)==0)
                iF(1,l)=iF(1,l)+1;
                xF(iF(1,l),l)=x2(i,l);
                bX2(i,l)=1;
                bF(j,l)=1;
            elseif (x2(i,l)>cBound(j,1))&&(x2(i,l)<=cBound(j,2))&&(bF(j,l)~=0)
                iMin=size(cBound,1);
                pMin=size(cBound,1);
                for m=j:-1:1
                    if (bF(m,l)==0)
                        iMin=m;
                        pMin=j-m;
                        break
                    end
                end
                for m=j:size(cBound,1)
                    if (bF(m,l)==0)&&(m-j<pMin)
                        iMin=m;
                        pMin=j+m;
                        break
                    end
                end
                iF(1,l)=iF(1,l)+1;
                xF(iF(1,l),l)=(x2(i,l)-(floor(x2(i,l)/fInt)*fInt))+((iMin-1)*fInt);
                bX2(i,l)=1;
                bF(iMin,l)=1;
                if l==1
                iMove=iMove+1;
                end
            end
        end
    end    
end