- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在阅读优化工具箱的 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
。这不好。很坏。太糟糕了,当我在文档中看到这一点时,我简直不敢相信自己的眼睛。请参阅this answer and references therein为什么eval
应该像瘟疫一样被避免。一般来说,eval
执行任意字符串,这为攻击者提供了潜在的入口点,但老实说,大多数用例对外人来说是无法访问的。但是,MATLAB 中的即时编译无法优化动态代码内的任何内容。最后,开始使用动态变量名称将导致您陷入难以逃脱的 eval
兔子洞。
那么,eval
的常用替代方案是什么,尤其是在动态字段名称方面?细胞,或更重要的是,结构。我更喜欢后者。让人们使用结构体而不是动态变量名的主要障碍是,结构体有一个不太广为人知的功能,即dynamic access of field names。 。以下两个是相同的:
% static version
mystruct1 = [];
mystruct1.field1 = 3;
% dynamic version
fname = 'field1';
mystruct2 = [];
mystruct2.(fname) = 3;
isequal(mystruct1,mystruct2)
% yes
因此,eval
问题的通常解决方案是使用具有动态字段名称的结构。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
的工具箱可能会给您带来其他惊喜,但我可能会采取这种方式。保持心理健康并避免可怕的反模式应该具有高度的激励作用。
1这也意味着有一种摆脱 eval
兔子洞的方法:将工作区保存为 .mat
文件,然后加载使用 dat = load('tmp.mat');
:结果将是一个 struct dat
,您可以按照您需要的方式轻松访问它。
关于matlab - 在 matlab 中创建索引变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39959835/
这几天我一直在努力。我一直在自学 CSS,所以对菜鸟好一点。我正在创建一个推荐 slider 。推荐以 3 个 block 显示。我希望前 2 个下降,第 3 个上升。但是当 slider 激活时,无
我最近开始学习 Nodejs,现在我很困惑我的网络应用程序使用什么,html 还是 ejs (Express)。 Ejs 使用 Express 模块,而 .html 使用 HTML 模块。我的第一个问
假设我们有一个 PostgreSQL 表contacts,每条记录都有一堆带标签的电子邮件地址(标签和电子邮件对)——其中一个是“主要”。 存储方式如下: id 主键 电子邮件 文本 email_la
我成功为一种新的tesseract语言编写了traineddata文件,但是当我完成时,我继续收到以下错误: index >= 0 && index = 0 && 索引 < size_used_ :E
这个问题已经有答案了: How to deal with SettingWithCopyWarning in Pandas (21 个回答) 已关闭 4 年前。 假设我有一个像这样的数据框,第一列“密
如果我有一个位置或行/列同时用于 A 和 B 位置,请检查 B 是否与 A 成对角线? 1 2 3 4 5 6 7 8 9 例如,我如何检查 5 是否与 7 成对角线? 此外,如果我检查 4 是
MongoDB:索引 一、 创建索引 默认情况下,集合中的_id字段就是索引,我们可以通过getIndexes()方法来查看一个集合中的索引 > db.user.getIndexes() [ { "v
一、索引介绍 索引是一种用来快速查询数据的数据结构。 B+Tree就是一种常用的数据库索引数据结构,MongoDB采用B+Tree 做索引,索引创建在colletions上。 MongoDB不使用索引
我无法决定索引。 就像我有下面的查询需要太多时间来执行: select count(rn.NODE_ID) as Count, rnl.[ISO_COUNTRY_CODE] as Cou
我有这些表: CREATE TABLE `cstat` ( `id_cstat` bigint(20) NOT NULL, `lang_code` varchar(3) NOT NULL,
我正在尝试找到一种方法来提高包含 IP 范围的 mysql 表的性能(在高峰时段每秒最多有 500 个 SELECT 查询(!),所以我有点担心)。 我有一个这种结构的表: id smallint(
jquery index() 似乎无法识别元素之一,总是说“无法读取未定义的属性‘长度’”这是我的代码。mnumber 是导致问题的原因。我需要 number 和 mnumber 才能跟踪使用鼠标,并
我们有一个包含近 4000 万条记录的 MongoDB 集合。该集合的当前大小为 5GB。此集合中存储的数据包含以下字段: _id: "MongoDB id" userid: "user id" (i
文档说:如果你有多个字段的复合索引,你可以用它来查询字段的开始子集。所以如果你有一个索引一个,乙,丙你可以用它查询一种一个,乙a,b,c 我的问题是,如果我有一个像这样的复合索引一个,乙,丙我可以查询
我正在使用 $('#list option').each(function(){ //do stuff }); 循环列表中的选项。我想知道如何获取当前循环的索引? 因为我不想让 var i = 0;循
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL
SQLite 索引(Index) 索引(Index)是一种特殊的查找表,数据库搜索引擎用来加快数据检索。简单地说,索引是一个指向表中数据的指针。一个数据库中的索引与一本书后边的索引是非常相似的。
我是 RavenDB 的新手。我正在尝试使用多 map 索引功能,但我不确定这是否是解决我的问题的最佳方法。所以我有三个文件:Unit、Car、People。 汽车文件看起来像这样: { Id: "
我有以下数据,我想根据范围在另一个表中建立索引 我想要实现的是,例如,如果三星的销售额为 2500,则折扣为 2%,低于 3000 且高于 1000 我知道它可以通过索引来完成,与多个数组匹配,然后指
我正在检查并删除 SQL 数据库中的重复和冗余索引。 所以如果我有两个相同的索引,我会删除。 例如,如果我删除了重叠的索引... 索引1:品牌、型号 指标二:品牌、型号、价格 我删除索引 1。 相同顺
我是一名优秀的程序员,十分优秀!