matlab面向对象
一、面向对象编程
1.1 面向过程与面向对象
- 区别:
- 面向过程的核心是一系列函数,执行过程是依次使用每个函数
- 面向对象的核心是对象(类)及其属性、方法,每个对象根据需求执行自己的方法以解决问题
-
对象:单个事务的抽象。也可理解为函数和数据的封装
-
面向对象的必要性:
1.2 对象的基本概念
- 类:一组相关的属性和行为的集合,是一个抽象的概念
- 抽象化:抽象代表现实世界中实体的行为
- 属性:存储在类中的数据和变量
- 方法:事物可以执行的操作或行为
- 初始化:构造一个类并指明固有属性的过程
- 对象:该类事物的具体表现形式,具体存在的个体
1.3 面向对象的三个特征
- 封装
- 一个对象就是一个封装了数据和操作这些数据的代码的实体
- 部分数据和方法只能通过内部访问,避免意外的修改
- 继承
- 可以复用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行拓展
- 提供了从特殊到一般的方法
- 多态
- 一个类实例的相同方法在不同情形有不同表现形式
- 不同的对象可以通过相同的操作来调用
1.4 MATLAB面向对象编程的用法
新建文件的时候直接新建一个类文件,会自动生成一个标准类模板:
classdef untitled%UNTITLED2 此处提供此类的摘要% 此处提供详细说明propertiesProperty1endmethodsfunction obj = untitled(inputArg1, inputArg2)% 构造函数本身obj.Property1 = inputArg1 + inputArg2;endfunction outputArg = method1(obj, inputArg)% 方法outputArg = obj.Property1 + inputArg;endend
end
注意:
- 类名称要和文件名保持一致
- properties关键字:类属性
- methods关键字:方法
- 在methods里必须存在一个与类名相同的函数,这个函数的输出变量就是类产生的对象
1.5 实例
定义一只小狗;属性:名字、年龄;初始化:输入名字;方法1:让它坐下;方法2:询问年龄
classdef dogproperties% 小狗的属性nameageend methodsfunction obj = dog(name, age)% 构造函数obj.name = name;obj.age = age;endfunction sit(obj)% 让小狗坐下fprintf('%s is now sitting.\n', obj.name);endend
end
二、面向对象的基本操作
2.1 类的属性和方法
-
属性
- 属性的默认值 —— 在属性列表中指定
- 常量属性:用Constant声明
- 非独立属性:用Dependent声明,属性值是否取决于其他值
- 隐藏的属性:通过Hidden声明,用于隐藏内部细节,使对象更简洁
-
属性的访问权限
- 语法:(Set / Get)Access = private / protected / public
- private:只有该类的成员方法可以访问
- protected:只有该类的成员方法和该类的子类可以访问
- public:除该类和子类外,在类之外的函数或脚本中也可以访问
-
方法
- 构造函数Constructor
- 构造函数和类的名称相同,用来创建类的实例
- 一个类的定义中只能有一个构造函数
- 构造函数只能有一个返回值,即新创建的对象
- 构造函数Constructor
2.2 类的组合和继承
- 继承是为了提高代码复用性,但也要注重逻辑性
-
实例:有一个车辆类vehicle,现在要创建一个电动车类e_vehicle
-
vehicle.m
classdef vehicle < handle propertiesmakeendproperties(SetAccess=protected)car_miles = 0;endproperties(Hidden)yearendproperties(Dependent)car_kmendmethodsfunction obj = vehicle(year, make)obj.make = make;obj.year = year;endfunction descripe(obj)fprintf('%s made in %d.\n', obj.make, obj.year);endfunction run(obj, miles)obj.car_miles = obj.car_miles + miles;endend end -
e_vehicle.m
classdef e_vehicle < vehiclepropertiessocendproperties(Constant)soc_per_mile = 1; % 常量属性endmethodsfunction obj = e_vehicle(soc, year, make)obj = obj@vehicle(year, make); % 用@调用父类方法obj.soc = soc;endfunction run(obj, miles)run@vehicle(obj, miles);obj.soc = obj.soc - miles*obj.soc_per_mile;endend end -
实例化一个e_vehicle对象ev
ev=e_vehicle(95,2020,'yiqi')
-
假设跑了10英里(调用ev的方法run),查看ev的里程
ev.run(10) ev.car_miles
-
跑了10英里后,电量减少了,ev.soc查看从95变成了85
-
2.3 句柄类和实体类
-
handle类是遵循句柄语义的所有类的超类
- 句柄是引用handle类的对象的变量
- 多个变量可以引用同一个对象
-
handle类是抽象类,无法直接创建该类的实例。可使用handle类派生其他类,可以使其实例为句柄对象的具体类
classdef MyHandleClass < handle % 表示MyHandleClass类继承于handle类... end -
值类(实体类,Value):
- 构造函数返回一个与其赋值变量相关联的对象
- 复制行为会创建一个独立的副本
- 值类对象在方法中修改后需要返回对象本身
-
句柄类:
- 构造函数返回一个句柄对象,该对象是对所创建对象的引用
- 复制的句柄指向同一块内存,不会创建副本
- 函数对作为输入参数传递的句柄对象进行修改后,不必返回该对象
例子:
值类dog_value.m
classdef dog_valueproperties% 小狗的属性nameageend methodsfunction obj = dog_value(name, age)% 构造函数obj.name = name;obj.age = age;endfunction sit(obj)% 让小狗坐下fprintf('%s is now sitting.\n', obj.name);endend
end
句柄类dog_handle.m(代码与值类一样,名称不同而已,定义时加上handle)
classdef dog_handle < handleproperties% 小狗的属性nameageend methodsfunction obj = dog_handle(name, age)% 构造函数obj.name = name;obj.age = age;endfunction sit(obj)% 让小狗坐下fprintf('%s is now sitting.\n', obj.name);endend
end
-
分别创建两种类的实例
-
复制值类dv,会创建一个独立的副本,即dv_copy与dv是相互独立的,互不影响
- 将dv的age修改成10,但是dv_copy的age没改变
-
复制句柄类dh,句柄指向同一块内存,不会创建副本,即修改其中一个的属性就会影响到另外一个
- 修改dh的年龄,dh_copy的年龄也被修改了
-
值类对象在方法中修改后需要返回对象本身
-
在值类dog_value.m中添加一个方法set_age用于修改年龄
-
如下图这样添加是无法修改的,因为值类对象在方法中修改后需要返回对象本身
function set_age(obj, age)% 修改年龄obj.age = age; end
-
正确的是:
- 调用的时候如果只是执行dv.set_age这个方法,dv的age并不会被修改,因为没有返回对象本身
-
-
正确的是
dv = dv.set_age(2),这样才能修改dv的agefunction obj = set_age(obj, age) % 修改后需要返回对象本身% 修改年龄obj.age = age; end
-
-
相比之下,句柄类就会更简单一些
-
直接添加如下方法,不需要返回对象本身
function set_age(obj, age)% 修改年龄obj.age = age; end
-
调用方法set_age后,dh对象的age即被修改
-
-
判断对象是否相等
- 对于handle类
- 可以用**==和isequal**判断是否指向同一块内存(句柄复制)
- 可以用isequal判断指向不同内存的对象是否属性一致
- 对于value类
- 不支持使用==判断相等关系,但可以进行运算符重载
- 可以用isequal判断相等关系
- 对于handle类
相关文章:
matlab面向对象
一、面向对象编程 1.1 面向过程与面向对象 区别: 面向过程的核心是一系列函数,执行过程是依次使用每个函数面向对象的核心是对象(类)及其属性、方法,每个对象根据需求执行自己的方法以解决问题 对象:单个…...
01、Cannot resolve MVC View ‘xxxxx前端页面‘
Cannot resolve MVC View ‘xxxxx前端页面’ 没有找到对应的mvc的前端页面。 代码:前端这里引入了 thymeleaf 模板 解决: 需要添加 thymeleaf 的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>s…...
时空智友企业流程化管控系统文件上传漏洞复现
0x01 产品简介 时空智友企业流程化管控系统是一个功能丰富、灵活可定制的企业管理工具。通过该系统,企业能够实现流程的自动化、协同的提升、数据的洞察和决策的优化,从而提高工作效率、管理水平和企业竞争力。 0x02 漏洞概述 时空智友企业流程化管控系…...
【已解决】Authenticator:无法添加账户请验证激活代码是否正确以及您的设备是否已为此应用启用推送通知
问题: 小米手机的Authenticator添加微软账户扫描QR码提示:无法添加账户请验证激活代码是否正确以及您的设备是否已为此应用启用推送通知 解决办法: 1、在通知管理中允许Authenticator所有通知。 2、在手机设置-账户与同步里找到谷歌基础服…...
聊聊springboot tomcat的maxHttpFormPostSize
序 本文主要研究一下spring boot tomcat的maxHttpFormPostSize参数 parseParameters tomcat-embed-core-9.0.37-sources.jar!/org/apache/catalina/connector/Request.java /*** Parse request parameters.*/protected void parseParameters() {parametersParsed true;Para…...
java并发:synchronized锁详解
背景: 在java多线程当中,我们总有遇到过多个线程操作一个共享数据时,而这个最后的代码执行结果并没有按照我们的预期一样得到正确的结果。此时我们就需要让代码执行在操作共享变量时,要等一个线程操作完毕时,另一个线程…...
Unity 之NavMeshAgent 组件(导航和路径寻找的组件)
文章目录 **作用**:**属性和方法**:**用途**:**注意事项**: NavMeshAgent 是Unity引擎中用于导航和路径寻找的组件。它可以使游戏对象在场景中自动找到可行走的路径,并在避免障碍物的情况下移动到目标位置。 以下是关于…...
装箱和拆箱
1. 概念 装箱 将值类型转换成等价的引用类型 装箱的步骤 拆箱 将一个已装箱的引用类型转换为值类型,拆箱操作需要声明拆箱后转换的类型 拆箱的步骤 1)获取已装箱的对象的地址 2)将值从堆上的对象中复制到堆栈上的值变量中 2. 总结 装箱和拆箱…...
等保测评--安全通信网络--测评方法
安全子类--安全架构 a)应保证网络设备的业务处理能力满足业务高峰期需要; 一、测评对象 路由器、交换机、无线接入设备和防火墙等提供网络通信功能的设备或相关组件 二、测评实施 1) 应核查业务高峰时期一段时间内主要网络设备(一般包括核心交换机、汇聚交换机、边界路…...
统计学补充概念11-tsne
概念 t-SNE(t-distributed Stochastic Neighbor Embedding)是一种非线性降维技术,用于可视化高维数据在低维空间中的分布。与主成分分析(PCA)等线性降维方法不同,t-SNE专注于保留数据点之间的局部相似性关…...
Linux_11_系统启动和内核管理
目录 1 C entOS 6 的启动管理1.1 Linux 组成1.2 内核设计流派1.3 CentOS 6启动流程1.3.1 CentOs 6 启动流程1.3.1 硬件启动POST1.3.2 bootloader 启动/引导加载器1.3.2.1 grub 功能和组成1.3.2.2 CentOS 6 grub 安装1.3.2.3 grub legacy 管理 1.3.3 加载 kernel1.3.4 init 初始…...
【从零学习python 】65. Python正则表达式修饰符及其应用详解
文章目录 正则表达式修饰符进阶案例 正则表达式修饰符 修饰符描述re.I使匹配对大小写不敏感re.M多行匹配,影响 ^ 和 $re.S使 . 匹配包括换行在内的所有字符 示例代码如下: import reprint(re.search(rL, hello)) # None# 不区分大小写,可…...
QA2
1. import shutil 是什么意思? 在 Python 中,import shutil 是导入标准库 shutil 的语句。shutil 提供了一些用于复制文件和文件夹、移动文件和文件夹、以及执行其他文件操作的函数。 通过导入 shutil,你可以使用其中的函数来处理文件和文件…...
centos7卸载docker
要在CentOS 7上干净地卸载Docker,可以执行以下步骤: 停止Docker服务: sudo systemctl stop docker移除所有Docker容器和镜像。这将删除所有相关数据,包括容器、镜像以及存储卷等。请注意,这将不可逆转地删除数据。 …...
【计算机视觉】递归神经网络在图像超分的应用Deep Recursive Residual Network for Image Super Resolution
DRCN: Deeply-Recursive Convolutional Network for Image Super-Resolution 总结 这篇文章是第一次将之前已有的递归神经网络(Recursive Neural Network)结构应用在图像超分辨率上。为了增加网络的感受野,提高网络性能,引入了深度递归神经网络&#x…...
Centos 7 安装系列(8):openGauss 3.0.0
安装依赖包: yum -y install libaio-devel flex bison ncurses-devel glibc-devel patch redhat-lsb-core readline-devel openssl-devel sqlite-devel libnsl 安装插件: yum install -y bzip2 net-tools为什么要安装这两个? 安装bzip2 是…...
NOIP真题讲解 传球游戏 接水问题
传球游戏 说明 上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,老师带着同学们一起做传球游戏。 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,…...
《论文阅读18》 SSD: Single Shot MultiBox Detector
一、论文 研究领域: 2D目标检测论文:SSD: Single Shot MultiBox Detector ECCV 2016 数据集 论文链接论文github 二、论文概要 SSD网络是作者Wei Liu在ECCV 2016上发表的论文。对于输入尺寸300x300的网络 使用Nvidia Titan X在VOC 2007测试集上达到74…...
NOIP2016普及组第四题 魔法阵
魔法阵 题目描述 六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法能量。 大魔法师有m个魔法物品,编号分别为1,2,…,m。每个物品具有一个魔法值,我们用Xi表示编号为i的物品的魔法值。每个魔法值Xi是不超过n的正整数&…...
uniapp-滑块验证组件wo-slider
wo-slider是一款支持高度自定义的滑块验证组件,采用uniapp-vue2编写 采用touchstart、touchmove、touchend事件实现的滑块组件,支持H5、微信小程序(其他小程序未试过,可自行尝试) 可到插件市场下载尝试: https://ext.…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
