将大量常量和工作区变量传递给 fsolve 目标函数的最佳方法是什么?

2024-01-13

与根本不使用全局变量相比,调用全局变量需要花费大量时间来加载:

考虑一个具有 1000 次迭代的循环,对这些变量进行一些计算:0.6 秒没有全局变量(约 1000 个变量),2.2 秒一个定义的全局变量(和其他变量),6 秒约 1000 个全局变量(和其他变量) )。因此,您会发现,与一开始就不使用全局变量相比,定义一个全局变量会减慢大量使用全局变量的函数中的迭代速度。

我当前的挑战是 fsolve 函数,它调用另一个函数并且似乎需要全局变量。这对我来说是一个大问题。我读到您可以将变量以不同的方式传递给函数,例如通过使用结构,但该结构必须在我的迭代中“解压”,从而再次减慢迭代速度。

现在我的问题:我不想使用全局变量。我如何在 fsolve 中规避它们?我的想法是在进入循环之前加载它们。请告诉我这里有什么我可以做的。

感谢您的阅读,请帮忙!

更新一:

   % load workspacevars.mat % I'm loading some variables that are going to be used.

one_of_the_variables_that_is_imported = 1;

for loop=1:1000
x(loop,:)=linspace(rand(),1,13); % x is going to change all the time, so I simulate this here
x1=x(loop,1); % 
x2=x(loop,2); % 
x13=x(loop,13); % shortened so you get the general idea.

result_1 = x1 * one_of_the_variables_that_is_imported
result_2 = x2 * one_of_the_variables_that_is_imported
result_13 = x13 * one_of_the_variables_that_is_imported

end

再说一次,我希望使用全局变量或加载工作空间来传递变量,这会如何解决?

更新二:

根据要求,这是一个与我的实际问题非常非常接近的示例(请不要被长度或显示吓倒,代码可以工作,但效率不太高)。再次,请关注主要问题,即我有大约 1000 个常量,我必须从 .m 工作区文件或全局变量调用这些常量,但我不希望这样做。

**小修改:我发现pastebin对此目的更有用:http://pastebin.com/6e1K90fR http://pastebin.com/6e1K90fR

更新三:

非常感谢@SCFrench!

我想我自己才发现全局变量与结构体相比需要多长时间!给大家分享一个有趣的故事:

在函数脚本中工作花费了非常长的时间,我无法弄清楚为什么(它有一些奇怪的滞后!)。直到我开始编辑变量以使其成为结构 - 我删除了所有全局定义,然后噗!所有浅蓝色的东西都消失了,我在编辑代码时不再有任何滞后!我简直不敢相信!

所以我现在的计划是 ctrl+H 我拥有的每个变量并将其替换为 c.Var。大约是 1000 Var,所以我最好在开始这项繁琐的任务之前问最后一次。我希望之后它会起作用。你的例子非常好,我读得越多,收获就越多。您能否最后解释一下变量常量是如何传递到 lambda 并传递给 myfun 的?我担心我不知道这种情况下的 lambda 一词,并且想更好地理解您。我无法对您的评论发表评论,因此对于这个冗长的更新感到抱歉,并提前非常感谢!

更新四:

没有全局变量的代码可以工作好极了!!!!!!非常感谢大家,这太棒了。我将每次迭代花费的总时间从可笑的 20 秒减少到不到 1 秒。效率提高 95%!

尽管我欣喜若狂,但有一点需要调整:我在 fsolve 中的结果之一迭代成功,没关系。但我在 f2 (要进行 fsolve 的函数)中包含了进一步的计算,不需要进行 fsolve,但我仍然希望在调用 fsolve 的 f1 中输出它。现在我的代码如下

[x,fval,exitflag,输出,雅可比] = fsolve(@(x) f2(x, c), x0, 选项);

虽然我宁愿有

[x,y,fval,exitflag,输出,雅可比] = fsolve(@(x) f2(x, c), x0, 选项);

但是当我尝试这样做时,我得到了太多的输出参数作为错误。所以我不得不采取绝望的措施并再次调用全局 y,以便两个函数都知道 y。既然我现在知道全局变量有多么可怕,你还能怎么做呢?


这是我如何解决这个问题的一个简化示例:

function y = example

% a1 = -2; a2 = -1; save('example_constants.mat')

constants = load('example_constants.mat');

y = fsolve(@(x) myfun(x, constants), [-5;-5]);

end

function F = myfun(x, c)
F = [ 2 * x(1) - x(2) - exp(c.a1 * x(1))
      -x(1) + 2 * x(2) - exp(c.a2 * x(2))];
end

这使用了 MATLAB 的两个功能。首先,如果您请求输出load,它将所有加载的变量存储为结构体的字段,并将该结构体作为其输出返回。调用 load 后,您可以使用以下表达式引用 MAT 文件中的每个常量constants.a1 (constants因为这是分配输出的变量的名称load, and a1因为这是存储在 example_constants.mat 中的变量的名称。它使用的另一个功能是匿名函数,用于将常量结构的值捕获到 lambda 中并将其传递给 myfun 作为第二个输入(c)在每次迭代中。

(你的问题提到了“解包”结构数组的开销。这种解包成本,如果它们甚至是明显的,将远远低于全局变量或每次调用目标函数时执行的加载语句的成本。)

这是假设您不需要目标函数来更新常量的值(在这种情况下,它们不是真正的常量,并且您的“load w.mat”变体将不起作用)。如果您确实需要,您应该考虑使用嵌套函数的类似技术。这两种技术都将进一步讨论here http://www.mathworks.com/help/optim/ug/passing-extra-parameters.html.

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

将大量常量和工作区变量传递给 fsolve 目标函数的最佳方法是什么? 的相关文章

  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • 如何在MATLAB中显示由三个矩阵表示的图像?

    我有 3 个相同大小的 2D 矩阵 假设 200 行和 300 列 每个矩阵代表三种 基本 颜色 红色 绿色和蓝色 之一的值 矩阵的值可以在 0 到 255 之间 现在我想组合这些矩阵以将它们显示为彩色图像 200 x 300 像素 我怎样
  • 使用可变数量的 for 循环创建元组

    Given n and k 我需要创建所有长度的元组k其条目来自range n 0 到 n 1 使得元组的条目按字典顺序排列 并且有特定格式的括号 具体来说 元组从内到外每对都用括号括起来 例如 如果n 3 and k 4 那么我希望输出包
  • 如果没有找到值,如何让 MySQL 中的 SUM 函数返回“0”?

    假设我在 MySQL 中有一个简单的函数 SELECT SUM Column 1 FROM Table WHERE Column 2 Test 如果没有条目Column 2 包含文本 Test 然后该函数返回NULL 而我希望它返回 0 我
  • 与保留模式 GUI 相比,使用立即模式 GUI 对性能有何影响?

    我目前正在开发一个标准的 Windows 桌面应用程序 标准意味着没有花哨的东西 只是按钮 文本 滑块等 在研究了一些 GUI 框架并被拒绝后 我决定自己编写一个 GUI 框架他们全部 由于这是一个业余爱好项目 我也愿意尝试 并决定将 GU
  • 如何解决“布局有超过 80 个视图,对性能不利”?

    我正在做一个有点复杂的布局 只是我无法修复 LINT 指示的错误 黑莓浏览次数超过 80 对性能不利 这是布局
  • 可以声明对 Rust 中未使用的结果发出警告的函数吗? [复制]

    这个问题在这里已经有答案了 Rust 是否有办法声明一个函数 对于任何类型 不使用其结果都会发出警告 类似于 GCC 的东西 attribute warn unused result 自 1 27 起 must use 也适用于函数 看来
  • 高效秒表

    您好 我正在用 javascript 编写一个秒表实用程序 我有一个关于效率和开销的问题 我考虑过两种制作秒表的方法 1 存储开始日期并不断测量自该日期以来经过的毫秒数 2 创建一个整数并按设定的时间间隔递增其值 我想知道哪个最有效 另外
  • 局部变量在栈中的顺序是怎样的?

    我目前正在尝试对缓冲区溢出漏洞进行一些测试 这是易受攻击的代码 void win printf code flow successfully changed n int main int argc char argv volatile in
  • MATLAB 类的 Description 和DetailedDescription 属性

    内置 MATLAB 类具有 Description 和 DetailedDescription 属性的值 gt gt handle ans meta class handle Package meta Properties Name han
  • C 中的变量定义是什么意思[重复]

    这个问题在这里已经有答案了 你们能告诉我 这在 C 中意味着什么吗 define Privileged Data Privileged Data static int dVariable 编译器对变量进行寻址有特殊意义吗 这只是一个宏Pri
  • 如何在 MATLAB 中绘制纹理映射三角形?

    我有一个三角形 u v 图像中的坐标 我想在 3D 坐标处绘制这个三角形 X Y Z 与图像中的三角形进行纹理映射 Here u v X Y Z都是具有三个元素的向量 代表三角形的三个角 我有一个非常丑陋 缓慢且令人不满意的解决方案 其中我
  • 快速查询最新记录的方法?

    我有一张这样的表 USER PLAN START DATE END DATE 1 A 20110101 NULL 1 B 20100101 20101231 2 A 20100101 20100505 在某种程度上 如果END DATE i
  • Bash 中的动态变量名称

    我对 bash 脚本感到困惑 我有以下代码 function grep search magic way to define magic variable 1 ls tail 1 echo magic variable 1 我希望能够创建一
  • 检测分段常数信号中的阶跃

    我有一个分段恒定信号 如下所示 我想检测步骤转换的位置 标记为红色 我目前的做法 使用移动平均滤波器平滑信号 http www mathworks com help signal examples signal smoothing html
  • 提高第一个查询的性能

    如果执行以下数据库 postgres 查询 则第二次调用要快得多 我猜第一个查询很慢 因为操作系统 linux 需要从磁盘获取数据 第二个查询受益于文件系统级别和 postgres 中的缓存 有没有一种方法可以优化数据库以快速获得结果fir
  • 打印包含字符串和其他 2 个变量的变量

    var a 8 var b 3 var c hello my name is var a and var b bye print var c 当我运行程序时 var c 会像这样打印出来 hello my name is 8 and 3 b
  • Grails 在 javascript 内的 GSP 站点中使用 grails var

    我有一个在 GSP 文件中的 javascript 代码中使用 grails 变量值的问题 例如 我有一个会话值session getAttribute selectedValue 我想在 javascript 代码部分使用这个值 我现在的
  • SignalR 似乎正在减慢我的 MVC/Azure 应用程序的启动速度

    我有一个 MVC 应用程序在 Windows Azure 上的 WebRole 上的 NET 4 5 下运行 使用 SignalR 1 0 alpha2 并使用 ServiceBus 底板 在我的 App Start 文件夹中 我有 Reg

随机推荐