确保 MATLAB 不会重新计算符号表达式

2023-12-05

我正在构建(我的第一个...)MatLab 程序,它需要对方程进行符号微分,然后多次使用此解决方案(使用不同的数字输入)。

我不希望它每次需要输入一组新的数值时都重新计算符号微分。这可能会大大增加运行该程序所需的时间(鉴于其本质,数字优化器,这可能已经是几个小时了)。

我的问题是如何构建我的程序,使其不会重新计算符号微分?

有问题的班级是:

function [ result ] = GradOmega(numX, numY, numZ, numMu)
syms x y z mu
omega = 0.5*(x^2+y^2+z^2) + (1-mu)/((x+mu)^2+y^2+z^2)^0.5 + mu/((x+mu-1)^2+y^2+z^2)^0.5;
symGradient = gradient(omega);
%//Substitute the given numeric values back into the funtion
result = subs(symGradient, {x,y,z,mu}, {numX, numY, numZ, numMu});
end

我知道我可以象征性地计算导数,然后将其复制粘贴到代码中,例如

gradX = x + ((2*mu + 2*x)*(mu - 1))/(2*((mu + x)^2 + y^2 + z^2)^(3/2)) - (mu*(2*mu + 2*x - 2))/(2*((mu + x - 1)^2 + y^2 + z^2)^(3/2));
gradY = y - (mu*y)/((mu + x - 1)^2 + y^2 + z^2)^(3/2) + (y*(mu - 1))/((mu + x)^2 + y^2 + z^2)^(3/2);
gradZ = z - (mu*z)/((mu + x - 1)^2 + y^2 + z^2)^(3/2) + (z*(mu - 1))/((mu + x)^2 + y^2 + z^2)^(3/2);

但我的代码有点神秘,这是共享项目中的一个问题。 这里有一个相关的查询:http://uk.mathworks.com/matlabcentral/answers/53542-oop-how-to-avoid-recalculation-on-dependent-properties-i-hope-a-mathwork-developer-could-give-me-a但我担心我无法遵循代码。 另外,我对 Java 和 Python 更加熟悉,如果这有助于解释什么的话。


您可以将函数包装到某种 Function-Factory 中,它不返回数值结果,而是返回可以计算的函数:

(我不得不更换电话syms with sym('mu'),因为由于某种原因它不断调用mutools函数内联omega = ...。我也将通话更改为gradient确保参数的顺序正确,并且mu将被视为常数。)

function GradOmega = GradOmegaFactory()
x = sym('x');
y = sym('y');
z = sym('z');
mu = sym('mu');
omega = 0.5*(x^2+y^2+z^2) + (1-mu)/((x+mu)^2+y^2+z^2)^0.5 + mu/((x+mu-1)^2+y^2+z^2)^0.5;
symGradient = gradient(omega,{'x','y','z'});
GradOmega = matlabFunction(symGradient, 'vars', {'x','y','z','mu'});
end

然后你可以通过以下方式调用它:

GradOmega = GradOmegaFactory();
result1 = GradOmega(numX1, numY1, numZ1, numMu1);
result2 = GradOmega(numX2, numY2, numZ2, numMu2);
result3 = GradOmega(numX3, numY3, numZ3, numMu3);
...

更好的是:

您可以更花哨并使用包装函数GradOmega它在内部构建了这样一个函数并使其persistent,以获得与最初方法相同的界面。第一次调用该函数时GradOmega符号表达式被计算,但在每次连续调用时,您只需计算生成的函数句柄,这意味着它应该几乎与硬编码一样快。

function result = GradOmega(numX, numY, numZ, numMu)
persistent numericalGradOmega;
if isempty(numericalGradOmega)
    numericalGradOmega = GradOmegaFactory();
end
result = numericalGradOmega(numX, numY, numZ, numMu);
end

像使用原始版本一样使用它

result = GradOmega(numX, numY, numZ, numMu);

只需将这两个函数复制并粘贴到一个函数中即可GradOmega.m file. (GradOmega应该是文件中的第一个函数。)


另一个提示:您甚至可以使用向量来评估该函数。而不是打电话GradOmega(1,2,3,4) and GradOmega(5,6,7,8)之后,您可以通过调用节省时间开销GradOmega([1,5], [2,6], [3,7], [4,8])使用行向量。

另一个提示:要进一步清理代码,您还可以将第一行放入单独的代码中symOmega.m file.

function omega = symOmega()
x = sym('x');
y = sym('y');
z = sym('z');
mu = sym('mu');
omega = 0.5*(x^2+y^2+z^2) + (1-mu)/((x+mu)^2+y^2+z^2)^0.5 + mu/((x+mu-1)^2+y^2+z^2)^0.5;

这样,您就不必在使用的每个文件中都拥有该符号表达式的副本。如果您也想评估,这可能会很有帮助Omega本身,因为您可以使用此答案中列出的相同工厂方法。您最终会得到以下文件:symOmega.m, Omega.m and GradOmega.m,其中只有文件symOmega.m有实际的数学公式,其他两个文件利用symOmega.m.

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

确保 MATLAB 不会重新计算符号表达式 的相关文章

  • UV 展开运行时优化

    我正在尝试在运行时创建 UV 我使用 BOX 类型 UV 类似于 3ds max 中的 BOX UVW 并基于面方向进行计算 我知道将其创建为运行时不是一个好的选择 但我别无选择 它是在计算后保存的 所以我做了一次 但我花了 40 秒处理
  • 如何在Matlab中将世界坐标转换为像素索引

    我有 512x512x313 体积的 dicom 图像 并且我有一个以世界坐标表示的点 57 7475 63 4184 83 1515 我如何在 Matlab 中获得该世界坐标的相应像素坐标 我不想戳破你的幻想 但你所要求的是不可能的 我能
  • 如何加载具有可变文件名的 .mat 文件?

    select all mat files oar dir oar mat n oar name loop through files for l 1 length oar load pat oar l lt this is the mat
  • 从 imread 返回的 ndims

    我正在从文件夹中选取图像 尺寸为128 128 为此 我使用以下代码行 FileName PathName uigetfile jpg Select the Cover Image file fullfile PathName FileNa
  • 如何每次使用按钮将数据添加到 MATLAB 中的现有 XLSX 文件?

    我有一个函数可以生成一些变量 例如分数 对 错 未回答 使用按钮调用此功能 问题是如何每次将函数生成的这些值添加 附加到 XLSX 文件中 或者 如何创建 MAT 文件以便可以添加它 可能的解决方案是什么 附加到 xls 文件所涉及的挑战是
  • MATLAB - GUI 和 OPC 服务器

    我想在 MATLAB 中设计一个图形用户界面 可以使用 MATLAB 的过程控制对象链接和嵌入 OPC 工具箱连续读取数据 我怎样才能实现这个 我已经设计了图形用户界面 但我无法将数据读入图形用户界面 就这样做 type opctoolMA
  • 如何获取MATLAB句柄对象的ID?

    当我尝试使用时出现问题MATLAB 句柄对象 http www mathworks com help techdoc ref handle html作为关键值MATLAB 容器 Map http www mathworks com help
  • 垂直子图的单一颜色条

    我想让下面的 MATLAB 图有一个沿着两个子图延伸的颜色条 像这样的事情 使用图形编辑器手动完成 Note 这与提出的问题不同here https stackoverflow com questions 39950229 matlab t
  • 如何为 CUDA 内核选择网格和块尺寸?

    这是一个关于如何确定CUDA网格 块和线程大小的问题 这是对已发布问题的附加问题here https stackoverflow com a 5643838 1292251 通过此链接 talonmies 的答案包含一个代码片段 见下文 我
  • 缩小 ASP.NET 生成的 Javascript 的最佳方法是什么?

    在 ASP NET 3 5 运行时缩小 ASP NET 生成的 Javascript 例如由 webresource axd 提供的 Javascript 的最佳方法是什么 我尝试使用Mb压缩 http mbcompression code
  • 将数据提示堆栈放在轴标签顶部,并在轴位置发生更改后更新轴标签

    此问题仅适用于 unix matlab Windows 用户将无法重现该问题 我在尝试创建位于 y 轴标签顶部的数据提示时遇到问题 下图很能说明问题 正如您所看到的 在 ylabel 附近创建的数据提示将到达 ylabel 文本的底部 而期
  • 找到一系列间隔的最有效分组

    我有一个应用程序 其中有一系列不重叠的固定宽度间隔 每个间隔都有一个给定的键 每个间隔具有相同的宽度 并且可以存在连续的间隔 本质上 我想以最小化单独间隔的数量的方式对间隔和键进行分组 这可以通过合并具有相同键的连续间隔或查找匹配间隔并将它
  • 优化mysql中日期类型字段的查询

    我目前准备了以下查询 select sum amount as total from incomes where YEAR date 2019 and MONTH date 07 and incomes deleted at is null
  • std::类似向量的类经过优化以容纳少量项目[重复]

    这个问题在这里已经有答案了 在程序的一个时间关键部分中 有一个类成员如下所示 std vector m vLinks 在分析过程中 我注意到该向量大约 99 98 的执行仅包含 0 或 1 个项目 然而 在极少数情况下 它可能会容纳更多 根
  • 在 Matlab 的命令窗口中获取旧式帮助

    问题的简短版本 在最新版本的 Matlab 中 我在 Windows 上的 R2014b 和 R2015a 中看到过 当您键入help foo你得到一个简要描述 简介函数及其签名 例如 输入help bsxfun产生类似这样的东西 只有更好
  • 如何在Matlab中绘制网络?

    我有一个矩阵AMatlab中的维数mx2每行包含两个节点的标签 显示网络中的直接链接 例如 如果网络有4矩阵的节点A可能A 1 2 1 3 2 1 2 4 3 2 4 1 4 2 其中第一行表示有一个链接来自1 to 2 第二行表示有一个链
  • 如何修复 TypeError: G 必须是 'd' 矩阵?

    目标 尝试通过优化过程运行玩具数据集 我遇到以下错误 TypeError Traceback most recent call last
  • Matlab:3D 堆积条形图

    我正在尝试创建一个 3D 堆积条形图 如这个问题所示 Matlab 中的 3D 堆叠条形图 https stackoverflow com questions 13156133 3d stacked bars in matlab 5D 然而
  • Rust 编程竞赛中最快的惯用 I/O 例程?

    我的问题已部分得到解答 因此我根据从评论和其他实验中学到的知识对其进行了修改 总之 我想要一个用于编程竞赛的快速 I O 例程 其中使用单个文件解决问题 无需外部包 它应该从一个以空格分隔的标记序列中读取BufRead 标准输入或文件 标记
  • 如何将数据传递给 MATLAB oncleanup 函数?

    我有一个编译好的 matlab 程序 可以自动调整机器参数 在调整周期结束时 我需要恢复一些原始设置 有时会发生意外错误 有时用户会发现调整算法未正常工作 因此应终止 使用 control C 如果发生可预测的错误 我可以使用 try ca

随机推荐

  • 使用 Python 的旧推文 Tweepy

    我正在尝试使用 Python 中的 tweepy 获取较旧的推文数据 大约 2 个月前 我尝试了自始至终的参数 但没有成功 有没有人在 tweepy 或其他 API 中找到解决办法 for id tweet in enumerate twe
  • 如何将布尔值插入数据库

    我必须将用户数据添加到名为 employees 的数据库表中 它有 ID 姓名 姓氏 用户名 密码 电子邮件 地址 管理员权限选项 Administator rigts 是布尔选项 是或否 当我制作一个包含所有数据的表单时 我想通过复选框检
  • 为什么Python无法从PIL导入图像?

    我尝试运行的单行如下 from PIL import Image 无论这看起来多么简单 它都会给出一个错误 Traceback most recent call last File C 2014 10 22 12 49 py line 1
  • 在 SQL Server 中创建审核触发器

    我需要对 SQL Server 2005 数据库中的两个表实施更改跟踪 我需要审核添加 删除 更新 详细说明更新内容 我本来打算使用trigger这样做 但似乎很容易错误地做到这一点 任何人都可以发布一个更新触发器的示例 以优雅的方式成功地
  • C# 如何将两个表达式组合成一个新表达式?

    我有两种表达方式 public static Expression
  • requiredFieldValidator - 因此,如果禁用 Javascript,则可以避免整个 .NET 控件?

    我最近正在使用 NET 并且检查了一些字段 我知道检查是在客户端 javascript 和服务器端进行的 Page Validate if Page IsValid 但如果禁用了 javascript 则所有这些都不会被检查 事实上 当我尝
  • ios 8自定义键盘按住按钮可以删除吗?

    我目前正在构建一个自定义键盘 我快完成了 我遇到的一个问题是删除按钮 当用户点击删除按钮时 它会执行它应该执行的操作并删除先前的文本条目 然而 当用户按住按钮时 什么也没有发生 如何让用户按住删除按钮时 键盘像标准ios键盘一样连续删除 这
  • 为什么延迟求值可以将不纯函数转化为纯函数?

    我知道纯函数是不依赖于系统状态的函数 没有副作用 其输出仅取决于其输入 进行 http 调用被认为是副作用 因此 以下是不纯函数的示例 const httpCall url params gt getJson url params 但是 只
  • pyqtgraph:对齐不同图中x轴的刻度

    这是后续这个问题 问题是当其中一个图重新缩放时如何调整多个 pyqtgraph 的 x 轴缩放 我想要的结果是所有图表的刻度完美对齐 以便您可以直接比较两个图表的内容 给定的答案存档了该任务 即根据变化重新缩放图表 但是当图表的内容不同时
  • 乔达时间:最近一周和一个月

    获取给定日期的最近完整一周和最近完整月份的开始 结束日期的最佳方法是什么 即给定今天的日期 如何找出刚刚完成的一周 一个月也是如此 我得到了解决方案 LocalDate today new LocalDate LocalDate lastW
  • C++ Primer(第 5 版):“16.3 重载和模板”的所有“更专业”示例都是错误的吗?

    C Primer 第 5 版 第 16 3 节 重载和模板 教授在存在候选函数模板实例化的情况下的函数匹配过程 以下是本节中使用的函数模板的声明 using std string template
  • Facebook 开放图谱和元标签

    我有以下输出https developers facebook com tools debug 我添加了locale元标签 因为我有很多无关的财产错误 但这并不能解决问题 Extraneous Property Objects of thi
  • React Native 中的 CameraX 视图 - 无法配置相机

    我正在创建cameraX视图 以便通过桥接来反应本机 普通视图在RN中渲染 桥接流程很好 PreviewView用于显示 CameraX 预览的相机源 我已成功实现预览 但不确定为什么预览未在 UI 上呈现 它只是一个空白屏幕 让我知道 U
  • Django 使用相关实体字段序列化查询集

    我正在尝试加入 2 个实体 从中获取特定字段 然后返回该实体的 JSON 我尝试编写以下代码 import datetime result Foo objects all result result select related bar e
  • 有没有“单项大小的异步任务缓冲区”这样的同步工具?

    在 UI 开发中 我多次以这样的方式处理事件 当事件第一次出现时 我立即开始处理 但如果有一个处理操作正在进行中 我会等待它完成 然后再处理另一个事件 如果在操作完成之前发生多个事件 我只处理最近的一个 我通常的做法是 我的处理方法有一个循
  • 如何允许 Java 客户端 TLS10 连接?

    在尝试使用 Java 16 在 Eclipse 中执行 hello world MSSQL JDBC 连接时 出现以下错误 server selected protocol version TLS10 is not accepted by
  • 如何将mongodb文档中的所有数组元素更改为某个值? [复制]

    这个问题在这里已经有答案了 假设我有以下文档 id ObjectId 5234cc89687ea597eabee675 code xyz tags school book bag headphone appliance qty size S
  • 从aspx网页读取xml

    我们必须从 aspx 页面读取数据 当我们使用查询字符串调用页面时 它会返回一个 xml 文档 其中包含与查询字符串匹配的数据 我们有一个与我们返回的 xml 相匹配的 XSD 我想我们可以从http响应中读取xml文档 这行得通吗 我们怎
  • 从服务访问 UI 线程处理程序

    我正在 Android 上尝试一些新的东西 我需要访问 UI 线程的处理程序 我知道以下几点 UI线程有自己的处理程序 和活套 任何消息都会被放置 进入UI的消息队列 线 Looper 获取事件 并将其传递给处理程序 处理程序处理消息并 将
  • 确保 MATLAB 不会重新计算符号表达式

    我正在构建 我的第一个 MatLab 程序 它需要对方程进行符号微分 然后多次使用此解决方案 使用不同的数字输入 我不希望它每次需要输入一组新的数值时都重新计算符号微分 这可能会大大增加运行该程序所需的时间 鉴于其本质 数字优化器 这可能已