在 matlab 中创建索引变量

2024-01-06

我正在阅读优化工具箱的 Matlab 用户指南。第 1-15 页提供了一些用于创建索引变量的代码。这是代码:

%Combine variables into one vector
variables = {'I1','I2','HE1','HE2','LE1','LE2','C','BF1',...
'BF2','HPS','MPS','LPS','P1','P2','PP','EP'};
N = length(variables);
% create variables for indexing
for v = 1:N
    eval([variables{v},' = ',num2str(v),';']);  %?
end

我知道“变量”的类别是元胞数组。但我无法清楚地理解“eval”的功能。阅读下面的代码,它似乎为变量中的元素创建了索引,以便元素可以用作操作矩阵或向量的索引号。例如:

lb = zeros(size(variables));
lb([P1,P2,MPS,LPS]) = [2500,3000,271536,100623];

我已经阅读了帮助文档,但仍然无法获取。所以,任何人都可以为我解释得更清楚。

顺便说一句,用户指南建议避免使用此“eval”功能。那么,有没有其他方法可以实现上述功能呢?

谢谢大家

完整的程序

% Combine variables into one vector
variables = {'I1','I2','HE1','HE2','LE1','LE2','C','BF1',...
   'BF2','HPS','MPS','LPS','P1','P2','PP','EP'};
N = length(variables);
% create variables for indexing
for v = 1:N
   eval([variables{v},' = ',num2str(v),';']);  %?
end


% Write bound constraints
lb = zeros(size(variables));
lb([P1,P2,MPS,LPS]) = ...
    [2500,3000,271536,100623];

ub = Inf(size(variables));
ub([P1,P2,I1,I2,C,LE2]) = ...
    [6250,9000,192000,244000,62000,142000];

% Write linear inequality constraints
A = zeros(3,N);
A(1,I1) = 1; A(1,HE1) = -1; b(1) = 132000;
A(2,EP) = -1; A(2,PP) = -1; b(2) = -12000;
A(3,[P1,P2,PP]) = [-1,-1,-1]; b(3) = -24550;

% Write linear equality constraints
Aeq = zeros(8,N); beq = zeros(8,1);
Aeq(1,[LE2,HE2,I2]) = [1,1,-1];
Aeq(2,[LE1,LE2,BF2,LPS]) = [1,1,1,-1];
Aeq(3,[I1,I2,BF1,HPS]) = [1,1,1,-1];
Aeq(4,[C,MPS,LPS,HPS]) = [1,1,1,-1];
Aeq(5,[LE1,HE1,C,I1]) = [1,1,1,-1];
Aeq(6,[HE1,HE2,BF1,BF2,MPS]) = [1,1,1,-1,-1];
Aeq(7,[HE1,LE1,C,P1,I1]) = [1267.8,1251.4,192,3413,-1359.8];
Aeq(8,[HE2,LE2,P2,I2]) = [1267.8,1251.4,3413,-1359.8];

% Write the objectvie
f = zeros(size(variables));
f([HPS PP EP]) = [0.002614 0.0239 0.009825];

% Solve the problem
%print out the results in floating-point fromat in a field 12     characters 
%wide, including 2 digits after the decimal point for first data
[x,fval] = linprog(f,A,b,Aeq,beq,lb,ub);
for d = 1:N
    fprintf('%12.2f \t %s \n',x(d),variables{d}); 
end
fval

我们中的一些人讨论了您的问题,但我们仍然对官方文档中出现这个可怕的怪物这一事实感到震惊:) 该示例的作用是淫秽的反模式,这不仅不安全,而且效率极低。你的怀疑是正确的,人们几乎不应该使用eval。如果可能的话,人们应该在不eval和动态变量名。当不可能时,人们应该重构他们所面临的任何代码,以便能够以一种良好、安全、快速和惯用的方式解决它。

这里的问题是构造本身要求使用eval。这不好。很坏。太糟糕了,当我在文档中看到这一点时,我简直不敢相信自己的眼睛。看这个答案和其中的参考文献 https://stackoverflow.com/questions/32467029/how-to-put-these-images-together/32467170#32467170为什么eval应该像瘟疫一样避免。一般来说,eval执行任意字符串,这为攻击者提供了潜在的入口点,但老实说,大多数用例对外人来说是无法访问的。但是,MATLAB 中的即时编译无法优化动态代码内的任何内容。最后,开始使用动态变量名称将引导您eval兔子洞很难逃脱。

那么,通常的替代方案是什么eval,特别是在动态字段名称方面?细胞,或更重要的是,结构。我更喜欢后者。让人们使用结构体而不是动态变量名的主要障碍是结构体有一个不太广为人知的功能,称为动态访问字段名称 https://www.mathworks.com/help/matlab/matlab_prog/generate-field-names-from-variables.html。以下两个是相同的:

% static version
mystruct1 = [];
mystruct1.field1 = 3;

% dynamic version
fname = 'field1';
mystruct2 = [];
mystruct2.(fname) = 3;

isequal(mystruct1,mystruct2)
% yes

So the usual solution to eval problems is using structs with dynamic field names.1

就您而言,这无疑会带来困难。可以理解的是,符号会变得更加麻烦。但原则上你可以放弃对eval,而是设置单个索引结构的字段is:

is = [];
for v = 1:N
   % nope eval nope nope nope nope
   is.(variables{v}) = v;
end

代价是你以后必须变得不那么简洁:

Aeq(6,[is.HE1,is.HE2,is.BF1,is.BF2,is.MPS]) = [1,1,1,-1,-1];

我知道您不愿意这样做,并且建议使用的工具箱eval这条路可能会给你带来其他惊喜,但我可能会走这条路。为了一个人的心理健康和避免可怕的反模式应该是高度激励的。

 

1this also implies that there's a way out from an eval rabbit hole: save your workspace as a .mat file, then load it with dat = load('tmp.mat');: the result will be a struct dat that you can readily access in the way you need to.

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

在 matlab 中创建索引变量 的相关文章

  • 为什么 mex 文件中的 OpenMP 仅产生 1 个线程?

    我是 OpenMP 新手 我有以下代码 使用配置了 MSVS2010 的 Matlab mex 可以正常编译 计算机有 8 个可用处理器 我也使用 matlabpool 检查过 include mex h include
  • 如何获取MATLAB句柄对象的ID?

    当我尝试使用时出现问题MATLAB 句柄对象 http www mathworks com help techdoc ref handle html作为关键值MATLAB 容器 Map http www mathworks com help
  • matlab部署工具到java包javac错误

    我正在尝试将我的程序包装为与 java 一起使用 我首先尝试了一个简单的 hello world 你好世界 m disp 你好世界 我使用了deploytool并选择了java包 当它到达这一行时 执行命令 javac verbose cl
  • 从筛查乳腺 X 光检查数字数据库 (DDSM) 获取数据

    我正在尝试以可读格式获取 DDSM 数据集 有谁有 DDSM heathusf 程序的工作版本 可以在 Linux 或 Windows 上正常运行吗 我知道 DDSM 的 jpeg 程序有一个适用于 linux 的工作版本 位于http w
  • 平衡两轮机器人而不使其向前/向后漂移

    我正在尝试设计一个控制器来平衡 2 轮机器人 约 13 公斤 并使其能够抵抗外力 例如 如果有人踢它 它不应该掉落 也不应该无限期地向前 向后漂移 我对大多数控制技术 LQR 滑模控制 PID 等 都很有经验 但我在网上看到大多数人使用 L
  • 术语 SSTable 和 LSM Tree 之间有什么区别

    这两个术语可以互换使用吗 我读过有关 SSTable 工作原理的文章 通常文章都会开始提到 LSM Tree 然而 它们似乎是同一件事 我什么时候应该使用一个术语而不是另一个术语 对于凡人来说 SSTables 和 LSM Trees 的最
  • 直方图均衡结果

    I am trying to code histogram equalization by my self but the results are different from the built in function in matlab
  • 在 Matlab 的命令窗口中获取旧式帮助

    问题的简短版本 在最新版本的 Matlab 中 我在 Windows 上的 R2014b 和 R2015a 中看到过 当您键入help foo你得到一个简要描述 简介函数及其签名 例如 输入help bsxfun产生类似这样的东西 只有更好
  • 对带有空白 NVARCHAR 或 NULL 检查的 VARCHAR 索引进行 Count(*) 会导致返回的行数加倍

    我有一张桌子 上面有VARCHAR列及其上的索引 每当一个SELECT COUNT 是在这张表上完成的 该表检查了COLUMN N OR COLUMN IS NULL它返回双倍的行数 SELECT 与相同的where子句将返回正确的记录数
  • 如何在向量中的所有点之间绘制线?

    我有一个包含二维空间中一些点的向量 我希望 MATLAB 用从每个点到每个其他点绘制的线来绘制这些点 基本上 我想要一个所有顶点都连接的图 你能用情节来做到这一点吗 如果可以 怎么做 一种解决方案是使用该函数为每个点组合创建一组索引MESH
  • 如何在Matlab中打印带有千位分隔符的整数?

    我想使用逗号作为千位分隔符将数字转换为字符串 就像是 x 120501231 21 str sprintf 0 0f x 但随着效果 str 120 501 231 21 如果内置fprintf sprintf做不到 我想可以使用正则表达式
  • Matlab 图像数据的 hist 函数

    我是 Matlab 新手 我想制作自己的函数 与 imhist 显示图像数据的直方图 完成相同的工作 但我对此完全是新手 我不知道如何做开发这样的功能 我开始做一些东西 但它非常不完整 function output args myhist
  • 以 2 为底的矩阵对数

    Logm 取矩阵对数 并且log2 取矩阵每个元素以 2 为底的对数 我正在尝试计算冯 诺依曼熵 它涉及以 2 为底的矩阵对数 我该怎么做呢 如果将 以 2 为底 的矩阵指数定义为B expm log 2 A 或者如果您类似地通过特征分解直
  • Matlab的导入函数的范围是什么?

    我正在尝试将一些用 Matlab 编写的代码转换为独立的 编译的 Matlab 应用程序 然而 在出现一些奇怪的错误之后 我意识到代码大量使用了从路径中添加和删除的操作 以避免多次使用多个具有相同名称 但结果 计算不同 的函数这一事实 环顾
  • 为什么图的 C++ 数据结构隐藏连续的整数索引?

    有向图和无向图的数据结构至关重要 众所周知且广泛使用的实现 例如Boost图库 http www boost org doc libs 1 56 0 libs graph doc table of contents html and Lem
  • 如何通过索引列表从 dask 数据框中选择数据?

    我想根据索引列表从 dask 数据框中选择行 我怎样才能做到这一点 Example 假设我有以下 dask 数据框 dict A 1 2 3 4 5 6 7 B 2 3 4 5 6 7 8 index x1 a2 x3 c4 x5 y6 x
  • 如何在 MATLAB 编译的应用程序中运行外部 .m 代码? [复制]

    这个问题在这里已经有答案了 我有一个 MATLAB 项目 我使用 MCC 对其进行编译以获得单个可执行文件 然后我想知道外部程序员是否可以在 exe 中执行他的一些 m 文件 而无需重新编译整个项目 重点是提供一个应用程序 其他开发人员可以
  • MATLAB 除法...29/128 应该返回 0 吗?

    我真的不认为这是一个精度问题 答案应该是0 226左右 这是确切的代码 val I i j bucketSize pos val bucketSize I只是我从中获取值的矩阵 以下是 MATLAB 的输出 val 29 bucketSiz
  • Deploytool for MATLAB R2013b 不起作用,发生了什么变化?

    多年来我一直在使用集成deploytool为我的同事创建易于分发的 exe 文件 我几天前安装了R2013b 但无法使用deploytool不再了 尝试打包时的日志文件给出了以下内容 ant
  • 获取包含矩阵行内最大值的列名称,该矩阵在数组内包含单独的最大值

    例如给出 dim1 lt c P PO C T dim2 lt c LL RR R Y dim3 lt c Jerry1 Jerry2 Jerry3 Q lt array 1 48 c 4 4 3 dimnames list dim1 di

随机推荐

  • Objective-C中使用GCD的dispatch_once创建单例

    如果您可以定位 iOS 4 0 或更高版本 使用GCD 这是在Objective C 线程安全 中创建单例的最佳方式吗 instancetype sharedInstance static dispatch once t once stat
  • 如何在自定义 Cordova 插件中包含多个 AAR 文件?

    我是科尔多瓦开发的新手 我需要编写一个引用两个 aar 文件的自定义插件 我可以将第一个 aar 文件添加到插件中 但是我对添加第二个 aar 文件有一些疑问 我可以在同一个自定义插件中添加第二个 aar 文件吗 或者我是否需要创建另一个自
  • 如何在 T-SQL 中计算 GROUP BY 行数

    我有一个 SQL 查询 它执行 GROUP BY 将包含相同 Player id 但不相同 Game id 的所有行合并在一起 SELECT p Player id p Name p Position SUM s Goals AS goal
  • 如何通过电视马拉松将消息转发给其他联系人

    当我收到联系人发来的消息后 如何立即将消息转发到另一个聊天室 我创建这个示例只是为了测试路由 但它不起作用 usr local bin python3 from telethon import TelegramClient events a
  • 如果进程以参数启动,Ruby readline 将失败

    我遇到了最奇怪的问题 下面的代码工作正常 require json require net http h Net HTTP new localhost 4567 while l gets chomp res h post api v1 se
  • Varargs Kotlin Java 互操作无法正常工作

    对于 makeSceneTransitionAnimation 有两个静态函数 public static ActivityOptionsCompat makeSceneTransitionAnimation Activity activi
  • Javascript键盘输入过滤

    有没有人有一个有效的动态 JavaScript 输入过滤器 可以限制跨多个浏览器的文本输入 我在网上看到了多个示例 但大多数似乎都有缺陷或缺乏多浏览器支持 我当前的尝试发布在下面 但在 Firefox 下移动数字失败 而且我还没有尝试过其他
  • Swift Actor 中发生数据争用

    我使用 Thread Sanitizer 在 Swift 应用程序中发现了数据争用 因此我第一次尝试通过转换有问题的数据来修复争用条件class to an actor 竞争造成的崩溃似乎已经消失 但 Thread Sanitizer 仍然
  • Angular 9 引入了需要加载的全局“$localize()”函数

    我在新的角度项目设置中遇到以下错误 已安装的软件包及其版本 https i stack imgur com 2Fb18 png 错误错误 未捕获 承诺 错误 它看起来像你的 应用程序或其依赖项之一正在使用 i18n 角9 推出了全球 loc
  • 将大流转换为字符串时内存不足

    我正在尝试将大流 4mb 转换为字符串 最终将其转换为 JSON 数组 当流大小很小 以 KB 为单位 时 一切正常 当它开始处理 4mb 流时 它就会耗尽内存 下面是我用来将流转换为字符串的方法 我几乎尝试了所有方法 我怀疑问题出在 wh
  • 无法初始化代理 - 无会话

    我有一个错误 看起来像这样 无法初始化代理 无会话 我正在使用 java hibernate 和 spring 尝试生成 PDF 文档时出现此错误 我正在按照后续步骤动态生成它并将其存储在数据库中 我通过 POST 方法向应用程序发送了请求
  • 使用 wget、curl 时 SSL 连接失败,但使用 firefox 和 lynx 时成功

    我在通过自动脚本访问该网站时遇到问题 如果我从浏览器 chrome firefox 甚至 lynx 都可以工作 查看 一切都可以 我如果尝试从 PHP fsockopen wget 或 curl 加载它 它会抱怨 警告 stream soc
  • 连接到 R 中的 Azure 表存储

    我一直在尝试连接到 R 中的 Azure 表存储 对于使用 R 连接到表存储的 Rest API 的用户 Google 搜索没有返回任何结果 文档是here https learn microsoft com en us rest api
  • 字符串替换方法不起作用[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions public static Stri
  • Jenkins + Python + MSBuild = 无 ANSI 颜色

    Short 如何获取从 Jenkins 运行的 MSBuild 的颜色 Long 我有一个很好的 Python 构建脚本 它使用 pyColors 模块将漂亮的输出打印到控制台 当我从 CMD 运行脚本时 我从脚本中获取颜色 从 MSBui
  • AVD 无法在屏幕上移动

    我刚刚创建了一个 AVD 但启动屏幕是空白的 无法在屏幕上移动 我的设置如下 安卓5 0 1手臂 比例 设备上 4dp 内存 512MB 虚拟机堆 128 MB 我认为您的 AVD 窗口的标题可能移至屏幕外 无法使用鼠标将其向下拖动 您可以
  • 回溯和递归的区别?

    回溯和递归有什么区别 这个程序是如何运作的 void generate all int n if n lt 1 printf s n ar else ar n 1 0 fix n th bit as 0 generate all n 1 g
  • 仅删除 mongoose 中填充数组中的文档 objectid

    我在尝试使用填充的查询从数组中删除 objectid 时遇到了很大的困难 这是我的架构 var userSchema new Schema username String password String books type Schema
  • 将 mysql 日期从一种格式转换为另一种格式

    我将日期存储在如下字段中 2013 年 12 月 31 日 但我需要将其更改为如下所示 2013 12 31 00 00 00 我尝试了 DATE FORMAT 和 strtotime 的很多变体 但一无所获 请问我该怎么办 Thanks
  • 在 matlab 中创建索引变量

    我正在阅读优化工具箱的 Matlab 用户指南 第 1 15 页提供了一些用于创建索引变量的代码 这是代码 Combine variables into one vector variables I1 I2 HE1 HE2 LE1 LE2