您当前的位置: 首页 >  matlab

slandarer

暂无认证

  • 7浏览

    0关注

    248博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

MATLAB | 面向对象编程基础 | 类的创建及运算符重载

slandarer 发布时间:2022-10-02 15:01:37 ,浏览量:7

很多人发现我的很多绘图函数都写成了类哈,这一期讲讲MATLAB面向对象编程基础知识之《类的创建及运算符的重载》。

首先点击图示位置创建类:

classdef untitled
    %UNTITLED 此处提供此类的摘要
    %   此处提供详细说明

    properties
        Property1
    end

    methods
        function obj = untitled(inputArg1,inputArg2)
            %UNTITLED 构造此类的实例
            %   此处提供详细说明
            obj.Property1 = inputArg1 + inputArg2;
        end

        function outputArg = method1(obj,inputArg)
            %METHOD1 此处提供此方法的摘要
            %   此处提供详细说明
            outputArg = obj.Property1 + inputArg;
        end
    end
end

我们看到自动生成的文件具有properties属性,methods方法等组成部分,对于基础的类有这俩部分已经足够了更复杂的类还会有比如events事件等一系列组成部分,

复数类与基础知识讲解 属性与构造函数

这里我们今天做示范就讲解一下如何建立一个复数类,复数类要包含实部和虚部两个属性,我们将这个自动生成的类进行一下改写,改成输入实部虚部两个参数创建新的对象,并将这两个属性分别存到对象的realimag属性:

classdef complexS
    properties
        real,imag
    end
    methods
        function obj=complexS(real,imag)
            obj.real=real;
            obj.imag=imag;
        end
    end
end

这样我们就可以通过如下方式创建复数:

 a=complexS(3,4)

a = complexS - 属性: real: 3 imag: 4

类的方法

我们定义一个名为sum的方法函数,实现实部加实部,虚部加虚部:

classdef complexS
    properties
        real,imag
    end
    methods
        function obj=complexS(real,imag)
            obj.real=real;
            obj.imag=imag;
        end
        function obj=sum(obj,arg)
            obj.real=obj.real+arg.real;
            obj.imag=obj.imag+arg.imag;
        end
    end
end

这样我们就可以通过sum实现俩复数的加法:

a=complexS(3,4);
b=complexS(1,-2);

c=sum(a,b)

c = complexS - 属性: real: 4 imag: 2

运算符的重载

但是sum(a,b)的形式太麻烦,我们有没有办法直接a+b就直接进行加法呢?MATLAB运算符的重载不像是C++的operater+的形式,它是直接每个运算符有专门的名字,例如算符+的名称为plus,将类改写:

classdef complexS
    properties
        real,imag
    end
    methods
        function obj=complexS(real,imag)
            obj.real=real;
            obj.imag=imag;
        end
        function obj=plus(obj,arg)
            obj.real=obj.real+arg.real;
            obj.imag=obj.imag+arg.imag;
        end
    end
end

运行一下加法:

a=complexS(3,4);
b=complexS(1,-2);

c=a+b

c = complexS - 属性: real: 4 imag: 2

给一下常见运算符的名称:

当然还有一些比如@,:等运算符,详细信息请参见: https://ww2.mathworks.cn/help/matlab/matlab_prog/matlab-operators-and-special-characters.html?s_tid=srchtitle_operator_5

单目运算符

有了上面的写法和思路,我们非常容易能使用minus定义出减法,但是这样的减法必须两个复数做减法,我只想把a变成-a咋办呢?我们注意到上面表里还有个叫做一元减法的玩意uminus这个能够实现相反数功能:

classdef complexS
    properties
        real,imag
    end
    methods
        function obj=complexS(real,imag)
            obj.real=real;
            obj.imag=imag;
        end
        % 加法
        function obj=plus(obj,arg)
            obj.real=obj.real+arg.real;
            obj.imag=obj.imag+arg.imag;
        end
        % 减法
        function obj=minus(obj,arg)
            obj.real=obj.real-arg.real;
            obj.imag=obj.imag-arg.imag;
        end
        % 一元减法
        function obj=uminus(obj)
            obj.real=-obj.real;
            obj.imag=-obj.imag;
        end
    end
end

试试正常减法和一元减法:

a=complexS(3,4);
b=complexS(1,-2);

a-b
-a

ans = complexS - 属性: real: 2 imag: 6 ans = complexS - 属性: real: -3 imag: -4

输入参数类型

我们有时候只想在右侧加个实数,而不一定加个复数咋办,我们可以在编写函数的时候用isa判断一下输入变量的类型再做出不同的处理,比如把之前的加法函数改为:

 % 加法
function obj=plus(obj,arg)
    if isa(arg,'double')
        obj.real=obj.real+arg;
    else
        obj.real=obj.real+arg.real;
        obj.imag=obj.imag+arg.imag;
    end
end
a=complexS(3,4);
b=complexS(1,-2);

a+1

ans = complexS - 属性: real: 4 imag: 4

输出函数的重载

我们每次运行完的结果显示都是

ans = complexS - 属性: real: 4 imag: 4

这种形式,我们怎么能很简洁的显示x+yi这种格式呢?想不到吧disp这个函数也能重载,将类改为如下形式:

classdef complexS
    properties
        real,imag
    end
    methods
        function obj=complexS(real,imag)
            obj.real=real;
            obj.imag=imag;
        end
        % 显示
        function disp(obj)
            if obj.real==0
                switch true
                    case obj.imag==0,fprintf('%s','0');
                    case obj.imag>0,fprintf('%s',[num2str(obj.imag),'i']);
                    case obj.imag0,fprintf('%s',['+',num2str(obj.imag),'i']);
                    case obj.imag0,fprintf('%s',[num2str(obj.imag),'i']);
                    case obj.imag0,fprintf('%s',['+',num2str(obj.imag),'i']);
                    case obj.imag0
                        oStr='+';
                    else
                        oStr='';
                    end
                    nStr=num2str(obj.coe(i));
                    if i~=length(obj.coe)
                    if str2double(nStr)==1,nStr='';end
                    if str2double(nStr)==-1,nStr='-';end
                    end
                    if i==(length(obj.coe)-1)
                        tStr=[oStr,nStr,'x'];
                    else
                        tStr=[oStr,nStr,'x^',num2str(length(obj.coe)-i)];
                    end
                end
                ind=find(abs(baseStr)==32,1);
                baseStr(ind:ind+length(tStr)-1)=tStr;
            end
            baseStr(abs(baseStr)==32)=[];
            if strcmp(baseStr(end-2:end),'x^0'),baseStr(end-2:end)=[];end
            if strcmp(baseStr(1),'+'),baseStr(1)=[];end
            disp(baseStr)
            end
        end
% 加法 --------------------------------------------------------------------
        function obj=plus(obj,arg)
            if isa(arg,'double')
                tcoe=arg;
            else
                tcoe=arg.coe;
            end
            L1=length(obj.coe);
            L2=length(tcoe);
            baseCoe=zeros([1,max(L1,L2)+1]);
            baseCoe(end+1-L1:end)=baseCoe(end+1-L1:end)+obj.coe;
            baseCoe(end+1-L2:end)=baseCoe(end+1-L2:end)+tcoe;
            obj.coe=baseCoe(find(baseCoe~=0,1):end);
        end
% 减法 --------------------------------------------------------------------
        function obj=minus(obj,arg)
            if isa(arg,'double')
                tcoe=arg;
            else
                tcoe=arg.coe;
            end
            L1=length(obj.coe);
            L2=length(tcoe);
            baseCoe=zeros([1,max(L1,L2)+1]);
            baseCoe(end+1-L1:end)=baseCoe(end+1-L1:end)+obj.coe;
            baseCoe(end+1-L2:end)=baseCoe(end+1-L2:end)-tcoe;
            obj.coe=baseCoe(find(baseCoe~=0,1):end);
        end
        function obj=uminus(obj)
            obj.coe=-obj.coe;
        end
% 乘法 --------------------------------------------------------------------
        function obj=mtimes(obj,arg)
            L1=length(obj.coe);
            L2=length(arg.coe);
            tmat=zeros(L2,L1+L2-1);
            for i=1:L2
                tmat(i,i:(i+L1-1))=arg.coe(i).*obj.coe;
            end
            obj.coe=sum(tmat);
        end
% 带余除法 -----------------------------------------------------------------
        function [obj1,obj2]=mrdivide(obj,arg)
            L1=length(obj.coe);
            L2=length(arg.coe);

            tCoe=obj.coe;
            obj1=polynom(0);
            for i=1:(L1+1-L2)
                obj1.coe(i)=1./(arg.coe(1)).*(tCoe(1));
                tCoe(1:L2)=tCoe(1:L2)-arg.coe.*obj1.coe(i);
                tCoe(1)=[];
            end
            obj2=polynom(tCoe);
        end

% 数值计算 -----------------------------------------------------------------
        function value=val(obj,x)
            value=x.^(length(obj.coe)-1:-1:0)*(obj.coe.');
        end
% 积分 --------------------------------------------------------------------
        function output=int(obj,a,b)
            if nargin            
关注
打赏
1664692598
查看更多评论
0.0431s