matlab里的function编程,MATLAB 元编程介绍

2023-11-14

这篇文章对 Matlab 中的元编程进行了简单的介绍。Matlab 是一个古老而又高度专业化的语言。由于这一原因,缺乏很多在现代或者通用语言中拥有的特性。然而,用一些简单的工具,我们可以发现 Matlab 也可以足够灵活去进行非常简单的元编程。

什么是元编程?为什么用 Matlab 来做

粗浅的说,元编程是将程序视为数据的过程——意味着一个程序可以像一个普通的数据片段一样被制造并且被操作。像 Ruby 语言就显示出了一些作为元编程语言的特性。Matlab 未能提供这样的一套工具用于进行元编程。然而事实上用一点创造性就能实现,用一些简单的工具箱完成这一点。

注意如果把这一部分的内容称为元编程的话,可能会有一些夸张,但是我认为内容上已经足够接近去自证这样的标签。

前提条件

本文的代码能运行是基于如下条件的:

函数是可实例化的(first class objects)

函数可以被匿名定义

符号表达式可以变作程序执行.

粗略的讲, 这些使我们可以定义符号表达式,修改他们,而且使他们变为函数。这就是这篇文章的核心观点

使用和修改符号表达式

首先定义一个符号变量

x = sym('x');

MATLAB 将会将 x 当做符号来处理,而不是数字。 然后我们可以构造更复杂的表达式,例如:

>> x + x

ans =

2*x

>> x * x

ans =

x^2

>> sin(x)^2 + cos(x)^2

ans =

sin(x)^2 + cos(x)^2

当然,最后一个表达式恒等于1. MATLAB 也知道:

>> simplify(sin(x)^2 + cos(x)^2)

ans =

1

而且可以做微积分:

>> diff(3*x^2 + sin(x))

ans =

6*x + cos(x)

>> int(6*x + cos(x))

ans =

sin(x) + 3*x^2

>> taylor(exp(x), x, 0, 'Order', 10)

ans =

x^9/362880 + x^8/40320 + x^7/5040 + x^6/720 + x^5/120 + x^4/24 + x^3/6 + x^2/2 + x + 1

symbolic 工具箱有一个叫 matlabFunction 的函数,可以把表达式专为一个函数:

>> p = matlabFunction(x^2 + 2*x + sin(x))

p =

@(x)x.*2.0+sin(x)+x.^2

>> p(0.2)

ans =

0.6387

有此利器在手,我们就可以编写,能写程序的程序了。

傅里叶级数逼近

傅里叶级数是一种函数逼近,由不同周期的正弦、余弦进行线性组合构成。 一个实际函数 f(x) 可以由如下级数逼近:

f(x)≈a02+∑n=1∞ancos(nx)+∑n=1∞bnsin(nx)

where:

a0=1π∫π−πf(x)dxan=1π∫π−πf(x)cos(nx)dxbn=1π∫π−πf(x)sin(nx)dx

这个近似已经精确地由这几个函数描述了, 但是我们准备写一个程序来近似一个随机的真实的函数,就用这个级数的截断的版本。

元编程实现傅里叶级数近似

现在,我们要实现一个函数,接收一个函数作为参数,返回另一个函数,是输入函数的截断的傅里叶级数近似。 有些更好的方法来实现元编程, 这里只是作为元编程的优雅的示例。

这个函数应按照如下形式工作

>> g = fourierapprox(f, N);

其中 f 是一个函数, N 是 f逼近中的最高项,g 为得到的近似函数。

首先, 我们创建一个符号表达式(最终会被转为MATLAB函数), 定义为一个独立变量x 。然后添加series的第一项:

function [fn] = fourierapprox(f, N)

series = sym();

x = sym('x');

a_0 = (1/pi) * integral(f, -pi, pi);

series = series + (1/2)*a_0;

...

end

(注意,我们使用 MATLAB自带的数值方法来计算必要的积分。)

下一步, 我们需要向series中添加有限项 (N)的正弦跟余弦的线性组合 :

function [fn] = fourierapprox(f, N)

series = sym();

x = sym('x');

a_0 = (1/pi) * integral(f, -pi, pi);

series = series + (1/2)*a_0;

for n = 1:N

a_n = (1/pi) * integral(@(x) f(x) .* cos(n*x), -pi, pi);

series = series + a_n * cos(n*x);

b_n = (1/pi) * integral(@(x) f(x) .* sin(n*x), -pi, pi);

series = series + b_n * sin(n*x);

end

fn = matlabFunction(series);

end

最后一行很关键: 他将一个单纯的符号变量转为一个可执行的函数。 这意味着 fn 表现的跟硬编码的函数一样! 称之为 ‘元编程’ 是没问题的, 因为我们通过程序生成了这个函数。

执行这个函数

我们来用刚才的函数生成一些近似函数看看。

下面这个函数将使用特定的间距在同一坐标系内绘出原函数跟傅里叶近似函数

function [ output_args ] = plotfourierapprox(f, N, a, b)

fplot(f, [a b], 'r');

hold on;

pn = fourierapprox(f, N);

fplot(pn, [a b], 'b');

end

方波

>> plotfourierapprox(@square, 5, -5, 5)

clSPJOmeJjwweCdg.png

>> plotfourierapprox(@square, 15, -5, 5)

fowZ97lc6GGFp9a3.png

f(x)=x3

>> plotfourierapprox(@(x) x.^3, 10, -4, 4)

YfgXfahcFI7rs4SJ.png

最后的话

元编程不是MATLAB中典型的编程范式。 我想展示的是,这不但可能,而且实用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

matlab里的function编程,MATLAB 元编程介绍 的相关文章

  • java使用aspose-words无损格式转pdf文件

    1 下载aspose wordsjar包 链接 https pan baidu com s 1Dtb hFgYJj2 F Ona8nErQ 提取码 kdrb 2 项目pom xml配置以下代码 执行下载jar包 这个时候肯定是下载不下来的
  • 美团某程序员哀叹:能力很强,却因为不会“向上管理”而惨遭被裁!怎么办?...

    互联网大厂大多有自己的绩效考核机制 比如 361 271 等 美团实行的绩效考核机制就是 271 即20 的人是A类绩效 70 的人是B类绩效 10 的人是C类绩效 那么这个绩效是如何评定的呢 是唯技术论还是有其他因素 评定过程中是否存在不
  • Linux——TCP编程流程

    TCP编程流程 TCP是传输层的一种协议 提供的是面向连接 可靠的 字节流的服务 主机字节序和网络字节序 主机字节序列分为大端字节序和小端字节序 不同的主机采用的字节序列可能不同 不同的芯片 所采用的数值存储方式是不同 大端字节序是指一个整
  • SQL server 导入Excel数据

    SQL server 导入Excel数据 编辑 洪伟富 2018 06 07 第一步 对表格数据的处理 这一列数据中有数字 又有中文 如果不做处理 导入数据库会默认为float 从而导致 公教楼201 等字符全部为null 解决办法 用筛选
  • 从键盘上输入身份证号, 判断出生日期,性别

    从键盘上输入身份证号 判断出生日期 性别 倒数第二位是奇数表示男 偶数代表女 public class IdNumber public static void main String args 1 键盘输入身份证号 Scanner intp
  • qt 导出word中插入图片

    QAxObject selection m word gt querySubObject Selection QVariantList params params append 6 params append 0 selection gt
  • 手把手教YOLO系列算法部署之安卓部署

    前言 首先我的yolov5的版本是v6 1 我的部署方式是将模型先转为tflite然后部署到安卓上 大家一般是使用自己的训练模型权重文件来部署 所以我直接讲述自定义模型的部署检测 链接 https pan baidu com s 1bskq
  • shouldComponentUpdate有什么作用

    shouldComponentUpdate有什么作用 shouldComponentUpdate是生命周期之一 是不常用的一个方法 能影响组件是否重新渲染 在更新阶段 当有了new props或者调用setState 方法 在render方
  • Mathorcup数学建模竞赛第三届-【妈妈杯】B题:关于三维健康评分模型的研究(附带赛题解析&获奖论文)(一)

    赛题描述 由于现代社会的生活节奏加快 生活工作压力增大 拥有一个健康的身体显得尤为重要 健康的标准有很多 但是如何量化这些标准 评价一个人的健康状况是一个比较困难的问题 世界卫生组织给出的健康标准有如下几个 1 精力充沛 能从容不迫地应付日
  • 【react】props的基本使用

    props可以用来组件传值 render里面的this指向Person的实例对象 而实例对象上有一个属性props 可以用他来给组件传值 class Person extends React Component render const n
  • SpringCloud——Gateway和过滤器和跨域问题的解决

    介绍 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目 该项目是基于 Spring 5 0 Spring Boot 2 0 和 Project Reactor 等响应式编程和事件流技术开发的网关 它旨在
  • LeetCode(20):有效的括号

    描述 给定一个只包括 的字符串 判断字符串是否有效 有效字符串需满足 左括号必须用相同类型的右括号闭合 左括号必须以正确的顺序闭合 注意空字符串可被认为是有效字符串 示例 输入 输出 true 输入 输出 true 输入 输出 true 输
  • 从ubuntu18 升级到ubuntu20 墙倒屋塌,重新开始

    升级到20 发现了各种不便 最主要是我的机器就是这个运行水平 不能再往上跟了 运行慢将不可容忍 启动慢 不可容忍 点击icon 有几秒种不响应期 难以容忍 与vmware虚拟机15不能很好兼容 并进一步不能与win7兼容 win7我认为是最
  • 基于线性回归对神经网络的解释以及梯度下降鞍点与局部最优的产生原理

    首先 机器学习的本质是让计算机找到一个函数来解决问题 这种函数非常复杂以至于人类无法直接手写出来 本文参考李宏毅教授视频ML 2021 Spring 神经网络是解决线性不可分问题 你可以引入多条线来分割当然我们也可以引入激活函数 非线性函数
  • 计算机视觉小项目—基于RGB颜色特征的火焰识别

    提出问题 随着计算机视觉及图像处理技术的发展 基于计算机视觉的火焰检测技术逐渐取代了传统的火灾检测 由于火焰最显著静态特质是其颜色 火焰识别算法主要利用视频图像中颜色与亮度的相关信息 所以对火焰颜色的特征提取是火焰识别过程的关键 在有关火焰
  • Spring Cloud Ribbon无法将服务名转换为地址

    试了许多网上说的 都不管用 后来发现是spring cloud starter eureka依赖项的版本问题 将版本降低后正常运行
  • fileclude(文件包含漏洞及php://input、php://filter的使用)

    先介绍一些知识 1 文件包含漏洞 和SQL注入等攻击方式一样 文件包含漏洞也是一种注入型漏洞 其本质就是输入一段用户能够控制的脚本或者代码 并让服务端执行 什么叫包含呢 以PHP为例 我们常常把可重复使用的函数写入到单个文件中 在使用该函数
  • Shell编程学习(一)简单介绍和执行shell脚本的方式

    Shell编程是什么 为什么要学习Shell 首先我们要知道 我们的Java项目一般都是部署到Linux系统上的 这是由于Linux相对于Windows而言呢有一下几点 开源 可以修改定制和再发布 安全性更高 虽然windows有很友好的可
  • [Spring学习]01 Spring简介

    目录 一 Spring介绍 二 Spring 官网介绍 三 Spring框架特征 四 Spring核心技术 一 Spring介绍 Spring是一个分层的轻量级开源J2EE框架 由Rod Johnson创建 Spring是一个开源容器框架

随机推荐

  • 【前端关于JSON.parse解析报错处理方案】

    项目场景 vue的移动端项目 ios 解析返回的json报错 JSON parse解析特殊字符报错的解决办法 问题描述 JSON parse 解析该字符串 则会出现报错 安卓可能并不会 原因分析 对于深度嵌套的JSON字符串 使用 JSON
  • 程序员网页版工具集合

    Overview 本文主要收集一下作为程序员经常会用到的一些小工具网站 crontab表达式 https tool lu crontab struct和json互转 https json2struct mervine net json转义工
  • 接口自动化实现图片上传(selenium/RF)

    最近做自动化碰到一个问题 就是带图片上传的不知道怎么实现自动化 整理了下实现如下 上传图片postman 结果请求如下 上传图片后返回一个图片地址 post请求 body 是form data 而不是json fiddler抓取如下 sel
  • 【数据结构】6.3 二叉搜索树(C++)

    数据结构 6 3 二叉搜索树 目录 一 二叉搜索树的概念 二 二叉搜索树的实现 1 存储结构和实现接口 2 方法的实现 2 1 默认成员函数 2 2 查找find 2 3 插入insert 2 4 删除erase 2 5 中序遍历 一 二叉
  • linux找不到root用户,Linux中root用户找不到JAVA_HOME

    使用DOS比较两个txt文件的差异 将两个文件放入到同一个文件夹下 DOS下提供了FC命令 点击开始 gt 运行 gt 输入cmd 进入DOS下 进入指定目录 输入FC a txt b txt进行比较 下面会显示出之间的差异 lbrack
  • 02.SVN 忽略不需要提交的文件

    我使用的是 TortoiseSVN 每次提交到 svn 上的时候我不想提交 idea 文件夹 不需要列出 服务器也不需要存 因为是编译器的文件 多人维护项目时 总会显示修改 最好的避免类似问题的方法是添加参考文件到该项目的忽略列表 这样就不
  • ApkScan-PKID查壳工具+脱壳(搬运)

    Android APK 查壳工具免费通道 链接 https pan baidu com s 1rDfsEvqQwhUmep1UBLUwSQ 密码 wefd看众多小伙伴需要脱壳工具 现在补上1 Zjdroid github https git
  • 计算机网络(谢希仁-第八版)第五章习题全解

    5 01 试说明运输层在协议栈中的地位和作用 运输层的通信和网络层的通信有什么重要的区别 为什么运输层是必不可少的 地位和作用 从通信和信息处理的角度看 运输层向它上面的应用层提供通信服务 它属于面向通信部分的最高层 同时也是用户功能的最低
  • 线程安全threadsafe的四种策略

    线程之间的 竞争条件 作用于同一个mutable数据上的多个线程 彼此之间存在对该数据的访问竞争并导致interleaving 导致post condition可能被违反 这是不安全的 线程安全 ADT或方法在多线程中要执行正确 一 Con
  • MyBatis Log 插件无法显示SQL语句的原因

    MyBatis Log是IDEA一款下载量非常高的插件 该插件可以对控制台打印的日志进行解析 然后将对应的SQL语句整理并拼接好对应的参数 非常方便 有时插件却无法打印SQL 总的来说 有如下三种原因 1 项目的日志等级过高 修改日志等级为
  • mysql的jdbc的url

    driver com mysql jdbc Driver url jdbc mysql localhost 3306 数据库名 useSSL true useUnicode true characterEncoding utf8 usern
  • 交互设计师

    岗位职责 对产品进行行为设计和界面设计 行为设计是指各种用户操作后的效果设计 Web的操作以点击为主 点击操作又可以分为 表单提交 类和 跳转链接 类两种 除点击外 还涉及到拖拽操作等 界面设计包括 页面布局 内容展示等众多界面展现 例如
  • java获取集合里重复出现的元素及其出现次数

    1 代码如下 package com qingfeng ArrayList import java util import java util stream Collectors author wfj since 2020 6 11 pub
  • 网站服务器正常,有的外部http访问会出现503

    Linux系统相关内核参数配置异常 将 etc sysctl conf下 net ipv4 tcp tw recycle 0 net ipv4 tcp timestamps 0 执行 sysctl p 使配置生效 net ipv4 tcp
  • python安装opencv安装出错_在CentOS上安装带有python模块的OpenCV出现错误

    我回答我自己的问题 希望遭受同样问题的人能在短时间内找到解决问题的方法 在 1 首先 用yum更新所有的页面包 在安装OpenCV时 我发现了几个由依赖性问题引起的bug 在sudo yum update skip broken 2 使用
  • js将时间搓转换成字符串格式

    var timestamp 1425553097 var d new Date timestamp 1000 根据时间戳生成的时间对象 var date d getFullYear d getMonth 1 d getDate d getH
  • 网状结构(图)图的存储(邻接矩阵、邻接表)、图的遍历(深度DFS、广度BFS)、图的最短路径

    图 多对多关系 是一种网状数据结构 图是由非空的顶点集合和一个描述顶点之间关系的集合组成 其定义 Graph V E V x x 某个数据对象 E
  • dashicons.min.css,WordPress前端使用跟后台的Dashicons图标字体?

    很多站长都喜欢在站点菜单或其他地方添加一些图标字体 常用的就是添加Font Awesome图标和阿里巴巴矢量库图标 其实我们使用的 wordpress 本身就有一套管理员使用的官方图标字体 Dashicons 登录我们站点后台就能看到这些图
  • 视频码率(Bitrate),帧率(FPS)和分辨率的联系与区别

    一 视频码率 码率就是数据传输时单位时间传送的数据位数 一般我们用的单位是kbps即千位每秒 也就是取样率 并不等同与采样率 采样率的单位是Hz 表示每秒采样的次数 单位时间内取样率越大 精度就越高 处理出来的文件就越接近原始文件 但是文件
  • matlab里的function编程,MATLAB 元编程介绍

    这篇文章对 Matlab 中的元编程进行了简单的介绍 Matlab 是一个古老而又高度专业化的语言 由于这一原因 缺乏很多在现代或者通用语言中拥有的特性 然而 用一些简单的工具 我们可以发现 Matlab 也可以足够灵活去进行非常简单的元编