首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Matlab逻辑索引中的惰性求值

Matlab逻辑索引中的惰性求值
EN

Stack Overflow用户
提问于 2016-12-11 05:14:39
回答 1查看 150关注 0票数 1

我想知道当我做类似这样的事情时,Matlab是否使用了惰性计算:

代码语言:javascript
运行
复制
sum(points.power(points.object == 5 & points.x .^2 + points.y .^2 < r^2))

这里的想法是计算对象5上所有点的幂,假设这些点在(0,0)的r范围内。点结构如下所示:

代码语言:javascript
运行
复制
points.object = [...]
points.x = [...]
points.y = [...]
points.power [...]

我希望Matlab不会为那些不属于对象5的点评估x^2+y^2,因为同样的原因,它不会评估2>3 && 3>4的第二部分。我说的对吗?

EN

回答 1

Stack Overflow用户

发布于 2016-12-11 05:15:45

首先,我认为你混淆了lazy evaluationshort-circuit evaluation

重要的是要理解&&&是不同的运算符。&&运算符allows for short-circuiting,此行为取决于每个输入计算为logical标量。

另一方面,&运算符接受两个数组作为输入,并在两个数组之间执行逐个元素的and。为了进行这种逐个元素的比较,它将在执行操作之前评估运算符两端的语句。您的语句等同于:

代码语言:javascript
运行
复制
and(points.object == 5, points.x.^2 + points.y.^2 < r^2)

其中,对points.object == 5point.x.^2 + points.y.^2 < r^2进行求值以生成logical数组。

如果要将第二个组件的计算限制为条件的第一部分为true的元素,则可以将其分解为多个语句,并使用第一个语句中的逻辑索引来确定计算第二个语句的元素。

代码语言:javascript
运行
复制
touse = points.object == 5;
touse(touse) = (points.x(touse).^2 + points.y(touse).^2) < r^2;

output = sum(points.power(touse));

重要的是要注意,这不一定会更快,因为现在执行了一些额外的索引。

也就是说,如果您在循环内执行此操作,并且在比较多个point.object值和r值时考虑到性能,则可以在循环外预先计算points.x.^2 + points.y.^2。在这种情况下,您还可以继续计算该值的平方根,这样就不必每次循环时都对r进行平方。

代码语言:javascript
运行
复制
% Pre-compute this so you only have to perform this operation once for each element
R = sqrt(points.x .^ 2 + points.y .^ 2);

for k = 1:5
    % Use the pre-computed value in your conditional
    value(k) = sum(points.power(points.object == k & R < r));
end
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41080400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档