跳转到内容

用户:Tttfffkkk/Madlag程序

维基百科,自由的百科全书

算法

[编辑]
穷举
  • clc;clear;
    numofvalues=3;%变量个数
    region=[1:50];%取值
    condition='x1+x2+x3==10';%条件
    showoutput=0;output='x1+x2';%额外输出
    
    way=0;
    scrsz=get(0,'ScreenSize');scx=scrsz(3);scy=scrsz(4);
    fig1=figure('position',[scx/2 scy/3 500 400]);
    way1=uicontrol('style','pushbutton','string','一般穷举',...
        'fontsize',30,'position',[100 310 300 80],...
        'callback','way=1;close all;','background','white');
    way2=uicontrol('style','pushbutton','string','顺序穷举',...
        'fontsize',30,'position',[100 210 300 80],...
        'callback','way=2;close all;','background','white');
    way3=uicontrol('style','pushbutton','string','互异顺序穷举',...
        'fontsize',30,'position',[100 110 300 80],...
        'callback','way=3;close all;','background','white');
    way4=uicontrol('style','pushbutton','string','互异穷举',...
        'fontsize',30,'position',[100 10 300 80],...
        'callback','way=4;close all;','background','white');
    while(way==0)
        pause(0.005);
    end
    
    fig2=figure('position',[scx/2 scy/3 500 400]);
    stop=uicontrol('style','toggle','string','暂停',...
        'fontsize',30,'position',[0 0 500 400],'background','white');
    Lregion=length(region);
    command='';t=0;
    switch(way)
        case 1
            for i=1:numofvalues
                command=[command 'for t' num2str(i) '=1:Lregion,'];
            end
        case 2
            command=[command 'for t1=1:Lregion,'];
            for i=2:numofvalues
                command=[command 'for t' num2str(i) '=t'...
                    num2str(i-1) ':Lregion,'];
            end
        case 3
            command=[command 'for t1=1:Lregion,'];
            for i=2:numofvalues
                command=[command 'for t' num2str(i) '=t'...
                    num2str(i-1) '+1:Lregion,'];
            end
        case 4
            for i=1:numofvalues
                command=[command 'for t' num2str(i) '=1:Lregion,'];
            end
            for i=1:numofvalues
                for j=i+1:numofvalues
                    condition=[condition ' && t' num2str(i)...
                        '~=t' num2str(j)];
                end
            end
        otherwise
            error('No way is choosed');
    end
    
    for i=1:numofvalues
        command=[command 'x' num2str(i) '=region(t' num2str(i) ');'];
    end
    command=[command,'if(eval(condition)),'];
    for i=1:numofvalues
        command=[command,'fprintf(''%d '',x' num2str(i) ');'];
    end
    if(showoutput)
        command=[command,'fprintf(''output=%g'',eval(output));'];
    end
    command=[command,'fprintf(''\n'');'];
    command=[command,'end,'];
    command=[command,'if(t==1e3)'];
    command=[command,'t=0;pause(0.005);'];
    command=[command,'if get(stop,''value'')==1,'];
    command=[command,'close all;return;end,'];
    command=[command,'end,t=t+1;'];
    for i=1:numofvalues
        command=[command,'end,'];
    end
    command=command(1:end-1);
    eval(command);
    close all;
    
默书系统
  • 使用前请先把字词数据保存到book.mat中,第一列放中文,第二列放英文,如: 桌子 table 椅子 chair
    clc;clear;
    load book.mat;
    n=size(book,1);
    correct=0;
    for i=randperm(n)
        fprintf('%s\n',book{i,1});
        x=input('英文:','s');
        wrong=0;
        if(length(x)==length(book{i,2}))
            if(x==book{i,2})
                fprintf('正确\n');
                correct=correct+1;
            else
                wrong=1;
            end
        else
            wrong=1;
        end
        if(wrong)
            fprintf('错误\n');
            fprintf('答案是%s\n',book{i,2});
        end
        x=input('是否继续?\n1.继续 2.结束\n');
        clc;
        if(x==2)break;end
    end
    score=fix(100*correct/n);
    fprintf('你的分数是:%d\n',score);
    

函数

[编辑]
欧拉函数
  • function varphi=varphi(n)
    %VARPHI the Euler function of an integer
    %  Use it with VARPHI(n)
    %  For example,VARPHI(6) returns 2
    
    if(n-fix(n)~=0 || n<0)
        error('k must be a positive integer');
    end
    f=factor(n);p=unique(f);varphi=1;
    if(n>1)
        for i=1:length(p)
            r(i)=length(find(f==p(i)));
            varphi=varphi*p(i)^(r(i)-1)*(p(i)-1);
        end
    end
    end
    
幂函数模运算
  • function y=pmod(n,m,k)
    %PMOD calculates the expression n^m(mod k)
    %  Use it with PMOD(n,m,k)
    %  For example,PMOD(2,2,3) returns 1
    
    if(any(([n,m,k]-fix([n,m,k])~=0)))
        error('n,m,k must be integer');
    end
    v=varphi(k);
    maxr=length(factor(k))-length(unique(factor(k)))+1;
    m=mod(m-maxr,v)+maxr;
    %if(gcd(m,v)==1)m=mod(m-maxr,v)+maxr;end
    if(k<0)k=abs(k);end
    if(m==0)
        y=1;
    elseif(m==1)
        y=mod(n,k);
    else
        y=mod(n,k);
        for i=1:m-1
            y=mod(y*n,k);
        end
    end
    end
    
一般函数模运算
  • function value=smod(str,k)
    %SMOD calculates the module k of the expression
    %  Use it with SMOD(str,k)
    %  For example,SMOD('10^(10^10)',7) returns 4
    
    if(k-fix(k)~=0)
        error('k must be integer');
    end
    if(k<0)k=abs(k);end
    exception=0;
    str2=str-0;
    f=[];chain=[];chain1=0;chain2=0;
    for i=1:length(str2)
        if(chain1==1)
            chain2=1;
            if(any(str2(i)==['0'-0:'9'-0]))
                f=[f i];
            else
                chain1=0;
                chain=[chain i-1];
            end
        else
            if(any(str2(i)==['0'-0:'9'-0 '-'-0]))
                f=[f i];chain=[chain i];chain1=1;
            end
        end
    end
    chain=[chain i];
    
    leftb=strfind(str,'(');
    rightb=strfind(str,')');
    if(length(leftb)~=length(rightb))
        error('blanklet error');
    end
    plb=strfind(str,'^(');
    groupb=[];i=0;
    while(~isempty(leftb))
        i=i+1;
        rbend=find(rightb>leftb(end),1);
        groupb=[groupb;leftb(end),rightb(rbend)];
        leftb=setdiff(leftb,leftb(end));
        rightb=setdiff(rightb,rightb(rbend));
    end
    leftb=strfind(str,'(');
    rightb=strfind(str,')');
    
    if(~isempty(plb))
        strplb1=str([1:plb(1)]);
        numb=smod(str([plb(1)+2:groupb(groupb(:,1)==plb(1)+1,2)-1]),varphi(k));
        strplb2=num2str(numb);
        if(groupb(groupb(:,1)==plb(1)+1,2)==length(str))
            strplb3=[];
        else
            strplb3=str([groupb(groupb(:,1)==plb(1)+1,2)+1:end]);
        end
        strplb=[strplb1 strplb2 strplb3];
        value=smod(strplb,k);
    else
        if(~isempty(leftb))
            if(leftb(1)==1)
                strb1=[];
            else
                strb1=str([1:leftb(1)-1]);
            end
            numb=smod(str([leftb(1)+1:groupb(groupb(:,1)==leftb(1),2)-1]),k);
            strb2=num2str(numb);
            if(rightb(1)==length(str))
                strb3=[];
            else
                strb3=str([groupb(groupb(:,1)==leftb(1),2)+1:end]);
            end
            str3=[strb1 strb2 strb3];
            value=smod(str3,k);
        else
            power=strfind(str,'^');
            for i=1:length(power)
                s=0;
                lc=find(chain==power(i)-1,1,'last');
                rc=find(chain==power(i)+1,1);
                s=s+~isempty(lc)+~isempty(rc);
                if(s==2)
                    exception=1;
                    strn=str([chain(lc-1):chain(lc)]);
                    strm=str([chain(rc):chain(rc+1)]);
                    n=str2num(strn);m=str2num(strm);
                    if(chain(lc-1)==1)
                        strpmod1=[];
                    else
                        strpmod1=str([1:chain(lc-1)-1]);
                    end
                    strpmod2=num2str(pmod(n,m,k));
                    if(chain(rc+1)==length(str))
                        strpmod3=[];
                    else
                        strpmod3=str([chain(rc+1)+1:end]);
                    end
                    str3=[strpmod1 strpmod2 strpmod3];
                    value=smod(str3,k);
                    break;
                end
            end
            if(exception==0)
                value=mod(eval(str),k);
            end
        end
    end
    end
    
从map找颜色
  • function value=findcolor(color,map,delta)
    %FINDCOLOR finds the responding color from the given map
    %  Use it with FINDCOLOR(color,map,delta)
    %  FINDCOLOR returns the value of the responding color among [0,255]
    %  delta is the biggest error of color defaulted 0
    
    if(nargin<2)
        error('Not enough input arguments');
    elseif(nargin==2)
        delta=0;
    end
    
    value=[];
    for i=1:size(map,1)
        d(i)=sum(abs(map(i,:)-color));
    end
    value=[value find(d<=delta)-1];
    if(isempty(value))
        mind=min(d);
        value=find(d==mind)-1;
    end
    end
    
绘图或合成图
  • function [image]=imdraw(varargin)
    %IMDRAW draw the color on the image by restrictions
    %  For 2-D image matrix
    %    Use it with IMDRAW(image,map,color,<restrictions>)
    %  For 3-D image matrix
    %    Use it with IMDRAW(image,color,<restrictions>)
    %  color can be [R G B] or another image
    %  <restrictions> including:
    %    'tcolor':IMDRAW(image,color,'tcolor',<tcolor>)
    %      The target color that you want to change.
    %      Write <tcolor> in the form [R G B].
    %    'colorerror':IMDRAW(image,color,'colorerror',<colorerror>)
    %      Accepted difference from the target color.
    %    'rect':IMDRAW(image,color,'rect',<rect>)
    %      Draw the color inside the rectangle.
    %      Write <rect> in the form [x1 y1 x2 y2].
    %      (x1,y1),(x2,y2) are the opposite points of the rectangle.
    %    'fun':IMDRAW(image,color,'fun',<fun>)
    %      Draw the color when the function values true.
    %      Write <fun> in the form 'f(x,y)' such as 'x^2+y^2<=1'
    image=varargin{1};
    if(ismatrix(image))
        if(length(varargin)<3)
            error('Not enough input arguments');
        end
        map=varargin{2};color=varargin{3};
        varargin=varargin(4:end);
    elseif(ndims(image)==3)
        if(length(varargin)<2)
            error('Not enough input arguments');
        end
        color=varargin{2};
        varargin=varargin(3:end);
    end
    
    tcolor=[];rect=[];fun=[];colorerror=0;
    while(~isempty(varargin))
        if(strcmp(varargin{1},'tcolor'))tcolor=varargin{2};end
        if(strcmp(varargin{1},'colorerror'))colorerror=varargin{2};end
        if(strcmp(varargin{1},'rect'))rect=varargin{2};end
        if(strcmp(varargin{1},'fun'))fun=varargin{2};end
        varargin=varargin(3:end);
    end
    
    if(ismatrix(image))
        image=imdraw1(image,map,color,colorerror,tcolor,rect,fun);
    elseif(ndims(image)==3)
        image=imdraw2(image,color,colorerror,tcolor,rect,fun);
    end
    end
    
    function [image]=imdraw1(image,map,color,colorerror,tcolor,rect,fun)
    [n1,n2]=size(image);
    if(strcmp(class(color),class([0 0 0])))
        value2=findcolor(color,map);
        row=ceil(length(value2)*rand);
    end
    if(~isempty(tcolor))
        value1=findcolor(tcolor,map,colorerror);
    end
    
    for y=1:n1
        for x=1:n2
            r=1;
            if(~isempty(tcolor))
                r=r*any(image(y,x)==value1);
            end
            if(~isempty(rect))
                x1=min(rect(1),rect(3));
                x2=max(rect(1),rect(3));
                y1=min(rect(2),rect(4));
                y2=max(rect(2),rect(4));
                r=r*(x1<=x)*(x<=x2)*(y1<=y)*(y<=y2);
            end
            if(~isempty(fun))
                r=r*eval(fun);
            end
            if(r==1)
                if(strcmp(class(color),class([0 0 0])))
                    image(y,x)=value2(row);
                else
                    image(y,x)=color(y,x);
                end
            end
        end
    end
    end
    
    function [image]=imdraw2(image,color,colorerror,tcolor,rect,fun)
    [n1,n2,n3]=size(image);
    for y=1:n1
        for x=1:n2
            r=1;
            if(~isempty(rect))
                x1=min(rect(1),rect(3));
                x2=max(rect(1),rect(3));
                y1=min(rect(2),rect(4));
                y2=max(rect(2),rect(4));
                r=r*(x1<=x)*(x<=x2)*(y1<=y)*(y<=y2);
            end
            if(~isempty(fun))
                r=r*eval(fun);
            end
            d=0;
            for k=1:n3
                if(~isempty(tcolor))
                    z=image(y,x,k);
                    if(z<tcolor(k))d=d+tcolor(k)-z;
                    else d=d+z-tcolor(k);end
                end
            end
            if(d<=colorerror && r==1)
                if(strcmp(class(color),class([0 0 0])))
                    image(y,x,:)=color;
                else
                    image(y,x,:)=color(y,x,:);
                end
            end
        end
    end
    end
    
传送到目标文件夹
  • function tp(x)
    %TP teleports the current working directory to your desire place
    %  Use it with tp(x)
    %  x can be number or string as defined in route.txt
    clc;
    fid=fopen('route.txt');
    C=textscan(fid,'%d%s%s');
    fclose(fid);
    selection=[C{2},C{3}];
    if(ismember(x,C{1}))
        cd(selection{find(C{1}==x,1),2});
    elseif(ischar(x))
        for i=1:size(selection,1)
            if(strcmp(x,selection{i,1}))
                cd(selection{i,2});
            end
        end
    end
    
    end
    

    请在route.txt中定义目标路径并放到与tp.m同一文件夹上,例如:

    0	fun	D:\我的madlag函数
    1	N	E:\笔记\matlab\madlag中级课程
    2	data	E:\笔记\数据分析