很多人发现我的很多绘图函数都写成了类哈,这一期讲讲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
事件等一系列组成部分,
这里我们今天做示范就讲解一下如何建立一个复数类,复数类要包含实部和虚部两个属性,我们将这个自动生成的类进行一下改写,改成输入实部虚部两个参数创建新的对象,并将这两个属性分别存到对象的real
和imag
属性:
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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?