matlab类—1

Matlab:实现DOA显示(附完整源码) 阅读详情

Matlab也可以写面向对象的代码,首先表现在可以定义类,以及可以继承,使用类(class)有很多好处,其中一个重要的好处便是解决变量名冲突和让函数、对象的结构清晰。class的static function可以在不定义类的实例直接调用类的成员函数,比如定义

[html] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. classdef tools < handle  
  2.     methods (Static = true)  
  3.         function a = test(b, c)  
  4.             a = b + c;  
  5.         end  
  6.     end  
  7. end  


然后可以直接通过

 

 

a = tools.test(b, c);

调用函数。

 

classdel是定义类名,后面的<是表示继承,Matlab允许多重继承,继承自handle类,handle类定义了很多关于object的处理函数,例如addListener以及notify还有delete等对对象的函数,是一个抽象类,不能实例化,具体可以看一下参考文献【2】。

类的方法是放在methods ...end里面。

 

下面是一个稍微复杂的类的定义

 

[html] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. classdef TensileData  
  2.    properties  
  3.       Material = 'carbon steel';  
  4.       SampleNumber = 0;  
  5.       Stress  
  6.       Strain  
  7.    end  
  8.    properties (Dependent)  
  9.       Modulus  
  10.    end  
  11.      
  12.    methods  
  13.       function td = TensileData(material,samplenum,stress,strain)  
  14.          if nargin > 0  
  15.             td.Material = material;  
  16.             td.SampleNumber = samplenum;  
  17.             td.Stress = stress;  
  18.             td.Strain = strain;  
  19.          end  
  20.       end % TensileData  
  21.    end  
  22.      
  23.    methods  
  24.       function obj = set.Material(obj,material)  
  25.          if ~(strcmpi(material,'aluminum') ||...  
  26.                strcmpi(material,'stainless steel') ||...  
  27.                strcmpi(material,'carbon steel'))  
  28.             error('Material must be aluminum, stainless steel, or carbon steel')  
  29.          end  
  30.          obj.Material = material;  
  31.       end % Material set function  
  32.         
  33.       function modulus = get.Modulus(obj)  
  34.          ind = find(obj.Strain > 0); % Find nonzero strain  
  35.          modulus = mean(obj.Stress(ind)./obj.Strain(ind));  
  36.       end % Modulus get function  
  37.         
  38.       function obj = set.Modulus(obj,~)  
  39.          fprintf('%s%d\n','Modulus is: ',obj.Modulus)  
  40.          error('You cannot set Modulus explicitly');  
  41.       end  
  42.         
  43.       function disp(td)  
  44.          fprintf(1,'Material: %s\nSample Number: %g\nModulus: %1.5g\n',...  
  45.             td.Material,td.SampleNumber,td.Modulus);  
  46.       end % disp  
  47.         
  48.       function plot(td,varargin)  
  49.          plot(td.Strain,td.Stress,varargin{:})  
  50.          title(['Stress/Strain plot for Sample ',num2str(td.SampleNumber)])  
  51.          xlabel('Strain %')  
  52.          ylabel('Stress (psi)')  
  53.       end % plot  
  54.    end  
  55.      
  56.    methods (Access = 'private') % Access by class members only  
  57.       function m = CalcModulus(td)  
  58.          % Over-simplified calculation of Elastic Modulus  
  59.          ind = find(td.Strain > 0); % Find nonzero strain  
  60.          m = mean(td.Stress(ind)./td.Strain(ind));  
  61.       end % CalcModulus  
  62.    end  
  63. end % classdef  

 

 

在上述代码中,

classdef TensileData

  ...

end

是定义一个TensileData类。代码:

 properties
      Material = 'carbon steel';
      SampleNumber = 0;
      Stress
      Strain
   end
 是定义这个类的属性,也就是C++中类的成员变量。但是和C++不同的是,matlab中的类定义还有一个比较特别的地方的,就是定义依赖属性,如下述代码:

 properties (Dependent)
      Modulus
   end

这表示Modulus这个属性是个依赖属性,它的值是通过其他属性计算得到的,其中Dependent的默认属性值为True。

它的值是通过下面函数实现的:

% Modulus get function

function modulus = get.Modulus(obj)
         ind = find(obj.Strain > 0); % Find nonzero strain
         modulus = mean(obj.Stress(ind)./obj.Strain(ind));
end

类的方法(函数)的定义是以methods ... end的的形式出现的。如下面的类方法的定义:

methods
      function td = TensileData(material,samplenum,stress,strain)
         if nargin > 0
            td.Material = material;
            td.SampleNumber = samplenum;
            td.Stress = stress;
            td.Strain = strain;
         end
      end 
end

该函数块定义了TensileData构造函数方法。上述代码中的最后一个方法 methods (Access = 'private')

中的Access = 'private'表示该方法仅能被类本身访问和修改,是个私有成员方法。其中属性Access又可分为

SetAccess和GetAccess,属性值和Access相同。

面向对象的使用必然导致程序的开销变高,关于相关的讨论可以看一下【1】:

封装后的函数多次调用会话费相当长的时间

 

所以到底该不该封装,还需取决于实际情况,如果函数本身特别简单,并且会被循环调用,最好还是通过m文件函数的形式。之前MIT大牛给出了更多地建议

  1. 虽然for-loop的速度有了很大改善,vectorization(向量化)仍旧是改善效率的重要途径,尤其是在能把运算改写成矩阵乘法的情况下,改善尤为显著。
  2. 在不少情况下,for-loop本身已经不构成太大问题,尤其是当循环体本身需要较多的计算的时候。这个时候,改善概率的关键在于改善循环体本身而不是去掉for-loop。
  3. MATLAB的函数调用过程(非built-in function)有显著开销,因此,在效率要求较高的代码中,应该尽可能采用扁平的调用结构,也就是在保持代码清晰和可维护的情况下,尽量直接写表达式和利用built-in function,避免不必要的自定义函数调用过程。在次数很多的循环体内(包括在cellfun, arrayfun等实际上蕴含循环的函数)形成长调用链,会带来很大的开销。
  4. 在调用函数时,首选built-in function,然后是普通的m-file函数,然后才是function handle或者anonymous function。在使用function handle或者anonymous function作为参数传递时,如果该函数被调用多次,最好先用一个变量接住,再传入该变量。这样,可以有效避免重复的解析过程。
  5. 在可能的情况下,使用numeric array或者struct array,它们的效率大幅度高于cell array(几十倍甚至更多)。对于struct,尽可能使用普通的域(字段,field)访问方式,在非效率关键,执行次数较少,而灵活性要求较高的代码中,可以考虑使用动态名称的域访问。
  6. 虽然object-oriented从软件工程的角度更为优胜,而且object的使用很多时候很方便,但是MATLAB目前对于OO的实现效率很低,在效率关键的代码中应该慎用objects。
  7. 如果需要设计类,应该尽可能采用普通的property,而避免灵活但是效率很低的dependent property。如非确实必要,避免重载subsref和subsasgn函数,因为这会全面接管对于object的接口调用,往往会带来非常巨大的开销(成千上万倍的减慢),甚至使得本来几乎不是问题的代码成为性能瓶颈。

 

 

参考文献:

【1】http://zhiqiang.org/blog/it/class-wrapper-functions-in-matlab.html

【2】http://cn.mathworks.com/help/matlab/ref/handle.html?searchHighlight=handle

【3】http://www.cnblogs.com/magic-cube/archive/2011/11/08/2241580.html

【4】http://anony3721.blog.163.com/blog/static/5119742011911111232557/

【MATLAB】MATLAB 类的定义和使用示例 MATLAB类的定义和使用 阅读详情

相关推荐

基于MATLAB的面向对象编程(1)——类,属性,方法

这里写目录标题1 入门1.1 如何把面条抽象成Class1.2 文件类2 基于MATLAB的面向对象编程入门2.1 如何定义一个类(Class)2.2 创建一个对象2.3 类的属性2.3.1 如何访问对象的属性2.3.2 默认属性值2.4 类的方法2.4.1 定义类的方法2.4.2 调用类的方法 1 入门 1.1 如何把面条抽象成Class 以面条为例。 classdef Noodle < handle properties type state end

伊谢尔伦的林中小路 2万+

Matlab中classdef函数的使用

classdef函数的功能是用于类定义关键字。

jk_101的博客 1万+

Python Scikit-learn 1.4 对比 MATLAB:3 类数学建模任务效率实测

本文通过对比Python Scikit-learn 1.4与MATLAB在回归分析、分类预测和聚类分析三类数学建模任务中的效率,揭示了两种工具在不同场景下的性能差异。实验结果显示,Python在内存管理和大规模数据处理上更具优势,而MATLAB在特定算法实现上表现更优。文章为数据科学家提供了实用的工具选型建议,帮助优化数学建模工作流程。

weixin_31499265的博客 353

Matlab中的类定义 classdef

Matlab也可以写面向对象的代码,首先表现在可以定义类,以及可以继承,使用类(class)有很多好处,其中一个重要的好处便是解决变量名冲突和让函数、对象的结构清晰。class的static function可以在不定义类的实例直接调用类的成员函数,比如定义 classdef tools < handle methods (Static = true) functio

Hard Working 1万+

Matlab:用户定义的类

Matlab:用户定义的类

希望我的博客,能帮上你解决学习中工作中所遇到的问题 490

【MATLAB教程案例1~10总结】通信类matlab仿真经验和技巧总结

一般情况下,短距离,大视频通信,可以选择16QAM,64QAM,对于类似指令类信号,或者信道环境较差的通信场合,可以选择BPSK,QPSK等等。从上面的链路结构图,我们可以知道,一个完整的通信链路发射端包括:信源,编码,交织,QAM映射,导频插入,串并,IFFT,并串,加cp加窗,DAC,IQ调制。通信链路接收端包括:ADC,IQ解调,时间同步和频偏粗估计,去CP,串并,FFT,并串,剩余频偏估计,信道估计,QAM解映射,解交织,FEC解码,信宿。这里面涉及插值,平滑,导频提取等操作。

FPGA/MATLAB学习教程/源码/项目合作开发 3257

Matlab机器人工具箱使用1 简单的描述类函数

matlab机器人工具箱1——基本的描述类函数

2301_80226956的博客 916

手把手教你学 MATLAB(3.1):编程与算法:面向对象编程:类和对象的概念,继承、封装、多态

Matlab深色版本propertiesMake % 品牌Model % 型号Year % 年份endmethods% 构造函数endend% 开始驾驶的方法endendend。

xiaoheshang_123的博客 351

Matlab图像处理:类内、类间测试的次数控制

现在假设,有10个人的人脸,每个人有10幅人脸样本,一共100幅人脸。类内测试:      如果采用1:1认证的方式,那么类内,也就是同类进行认证测试,每个人最多可以测试(9+8+7...1)=(9*(9+1))/2. 可以这么理解,第一个人脸和后面9个依次认证依次,然后第二个人脸和后面8个依次认证,最后求和。【等差数列的求和:(n*(n+1)*d)/2 】 因为是10个人,所以类内一共可以测试1

yanzi1225627的专栏 3610

python 常见算法(1-50题)

常见的算法题

weixin_58470558的博客 1755

别只当玩具!聊聊这个555金属探测器电路背后的电磁感应与RLC调谐原理

本文深入解析了555金属探测器电路的工作原理,重点探讨了电磁感应与RLC调谐原理。通过分析电感线圈的电磁特性、RLC谐振电路的行为以及555定时器的多重功能,揭示了这一看似简单的装置如何实现金属检测。文章还提供了灵敏度优化方案和常见问题解决方法,帮助读者从科学角度理解这一实用技术。

weixin_29204205的博客 477

【整数规划】+【0—1规划】解决优化类问题(Matlab代码)

在规划问题中,有些最优解可能是分数或小数,但对于某些具体问题,常要求某些变量(全部或部分)的解必须是整数。例如当我们的变量时人数或者机器的台数。此时我们就需要利用整数规划来求最优解。背包问题和指派问题是运用0-1规划的常见两种情况,需要掌握还有其他一些情况大家可自行查找资料学习。

wxhdvd的博客 2569

3GPP Release与UE Category:无线通信标准演进与终端能力分级全解析

在蜂窝移动通信领域,技术标准的演进与终端设备的能力分级是理解整个产业发展的核心框架。其基本原理由国际标准组织3GPP通过周期性发布的技术规范版本(Release)来定义,每个Release都像一份阶段性的技术蓝图,规定了网络与终端应支持的新功能与性能基线。这种标准化机制的技术价值在于确保了全球设备的互联互通与网络的平滑升级,为从4G LTE到5G NR乃至未来的演进提供了清晰路径。在这一框架下,终端能力分级(如LTE时代的UE Category)是将标准转化为具体设备性能的关键环节,它直接定义了终端在射频和

weixin_34098209的博客 329

fir1函数matlab_电气信息类专业课程之matlab系统仿真 第三章 滤波器的种类(1)...

在讲解滤波器的种类之前,必须先讲解滤波器实现滤波的过程。怎么实现?matlab中是可以用filter函数,那总不能在单片机或者FPGA中也调用filter函数吧。可能吗?不可能!那怎么实现滤波过程呢?先来了解滤波过程的本质,就是乘加运算。FPGA里面实现乘加运算时非常容易的。先来看看FIR滤波器在窗函数设计方式中采用不同窗的效果。怎么观察效果?肯定是通过幅频响应了。数字信号处理中通常是取...

weixin_36257759的博客 858

DPABI实战:手把手教你处理小鼠静息态fMRI数据(从Voxel Size到SPM完整流程)

本文详细介绍了使用DPABI处理小鼠静息态fMRI数据的完整流程,从Voxel Size调整到SPM分析,涵盖预处理、质量控制和可视化等关键步骤。针对小鼠数据特有的低分辨率和信噪比问题,提供了实战建议和避坑指南,帮助研究人员高效完成数据分析。

weixin_42663213的博客 476

Cadence Allegro新手避坑:从原理图到PCB,解决‘netrev.lst does not exist’的完整流程

本文详细介绍了Cadence Allegro从原理图设计到PCB导入网表的完整流程,特别针对新手常见的'netrev.lst does not exist'错误提供了系统解决方案。内容包括环境准备、原理图设计规范、网表生成与导入技巧,以及设计数据管理最佳实践,帮助工程师高效完成PCB设计任务。

weixin_42685438的博客 486

面向对象Matlab编程小demo

1.前言 matlab初学者,在编写matlab代码时,感觉代码比较乱,不好写也不易看,突然想到是否可以使用面向对象的思想去编写matlab程序,在网上找了找,果然有一本专门讲解面向对象的matlab书,并且作者还讲解了设计模式,很不错。自己也尽量的使用之前编写Java程序的方式去写,简单地写一个demo程序,以方便自己以后查看。 参考书籍:《》 操作系统:win7 matlab版本:

xiaominthere的专栏 4533

【智驾与大模型】端到端与多模态大模型的精彩之旅

智驾和大模型的回顾与展望。开头的笔者自述也说了些心窝子话,边缘计算的监管刻不容缓!

仿生实验室:从0到1,制作人脸表情交互机器人,记录过程,软硬件全部开源,与君共襄盛举! 1318

编程类-----matlab基础语法复习(1)

  2019年美赛随笔记录:     具体功能:基础语法+基本运算+画图+矩阵+excel读取.......     所遇问题及其解决方案:          1. que:matlab中plot画图无法复制下来图片? ans: copy figure 或复制图片后在word中才可粘贴         2. que:论文中代码的格式? ans:代码放到publis...

weixin_30807677的博客 161

【实战解析】Ubuntu双网卡冲突:如何解决同一网段下网关无法访问及上网问题

本文深入解析Ubuntu服务器双网卡配置在同一网段时引发的路由冲突问题,导致网关无法ping通及无法上网。通过分析路由表与Metric值原理,提供使用route命令调整优先级及修改Netplan配置文件的实战解决方案,确保主次路由明确,一劳永逸解决网络冲突。

f9g0h的博客 280

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

COMSOL with Simulink协同仿真1:提示无法加载类 ‘matlab.lang.OnOffSwitchState‘

comosl5.6版本增加了comsol with simulink的功能,可以实现comsol与simulink的协同仿真。 学习comsol官网给的案例,在操作中出现如下图所示的错误。 无法加载matlab中的一个类 百度查找,类 ‘matlab.lang.OnOffSwitchState’,提示该类的作用是,从 logical 类派生的枚举类。使用该类指定接受值 ‘on’ 和 ‘off’ 以及逻辑值 true、false、1 或 0 的属性的数据类型。 其实看了说明也不清楚这个类是干什么用的。 继续

sunchaooc的专栏 2172

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Matlab 2012a 面向对象(1):二维点,地理点和地理线的类设计和实现

对Matlab的面向对象编程进行了阐述,针对二维点,地理点,地理线的类设计和实现进行了分析,最后给出驱动程序作为实例进行讲解。可供学习Matlab面向对象编程和WebGIS学习做参考。

zjjsd195的专栏 388

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Matlab与Java混合编程的教程

许多方面我们用到了MATLAB的强大数学计算能力,也同时JAVA语言是现今使用最多的编程语言。现在的Android也同样使用JAVA语言来实现。 下面我就如何进行混合编程做了一下步骤。 第一步:当然是安装好MATLAB程序和JDK,我是用的MATLAB版本是R2013a, JDK是版本1.7;同时使用eclipse开发工具作为编写java的的开发工具。 第二步:在MATLAB中编写一个FUN

ShyBoyes的专栏 1万+
上一篇: 卷积的理解
下一篇: 傅里叶变换的意义
cppstdy
博客等级 码龄15年 89粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值