val_redu.m

来自「薛定宇高等应用数学问题的MATLAB求解例子源码」· M 代码 · 共 64 行

M
64
字号
function y=val_redu(re,d,x)
[p,q]=size(x); yy=[re,d]; zz=[1:q];
zy=setdiff(zz,yy); [zy1,zy2]=size(zy);
for u=q:-1:1
    for v=zy2:-1:1
        if zy(v)==u, x(:,u)=[]; end
    end
end
y=x; tmp=y; [yp,yq]=size(y); [dp,dq]=size(d);
%z=zeros(size(y)); z=ones(yp,yq-dq)*(-1);
for i=1:yp
    for j=1:yq-dq
        tmp(:,j)=[]; [tp,tq]=size(tmp);
        for ii=1:yp
            if ii==i, a=0;
            elseif tmp(ii,1:tq-dq)==tmp(i,1:tq-dq)&tmp(ii,tq-dq+1:tq)~=tmp(i,tq-dq+1:tq)
                z(i,j)=y(i,j);
            elseif tmp(ii,:)==tmp(i,:)
                y(i,j)=inf; z(i,j)=y(i,j);
            end
        end
        tmp=x;
    end
end
num=zeros(1,yp);
for i=1:yp
    for j=1:yq-dq
        if z(i,j)==-1, y(i,j)=-1; z(i,j)=inf; end
    end
end
for i=1:yp
    for j=1:yq-dq
        if z(i,j)==inf, num(1,i)=num(1,i)+1; end
    end
end
for i=1:yp
    if num(1,i)==yq-dq;
        for j=1:yq-dq
            if y(i,j)==-1, y(i,j)=x(i,j); end
        end
    end
end
for i=1:yp
    omit{i}=[];
    for j=1:yq-dq
        if y(i,j)==-1
            for jj=1:yq-dq
                if z(i,jj)~=inf, omit{i}=cat(2,omit{i},jj); end
            end
            tt=omit{i}; hhh=y(i,omit{i}); ddd=y(i,yq-dq+1:yq);
            if ismember(ind_cls(hhh,omit{i},x),ind_cls(ddd,yq-dq+1:yq,x))
                y(i,j)=inf;
            else
                y(i,j)=x(i,j);
            end
        end
    end
end
for i=yp:-1:1
    if y(i,1:yq-dq)==inf*ones(size( y(i,1:yq-dq)))
        y(i,:)=[];
    end
end
y=sam_del(y);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?