我想知道当我做类似这样的事情时,Matlab是否使用了惰性计算:
sum(points.power(points.object == 5 & points.x .^2 + points.y .^2 < r^2))
这里的想法是计算对象5上所有点的幂,假设这些点在(0,0)的r范围内。点结构如下所示:
points.object = [...]
points.x = [...]
points.y = [...]
points.power [...]
我希望Matlab不会为那些不属于对象5的点评估x^2+y^2,因为同样的原因,它不会评估2>3 && 3>4
的第二部分。我说的对吗?
发布于 2016-12-11 05:15:45
首先,我认为你混淆了lazy evaluation和short-circuit evaluation。
重要的是要理解&&
和&
是不同的运算符。&&
运算符allows for short-circuiting,此行为取决于每个输入计算为logical
标量。
另一方面,&
运算符接受两个数组作为输入,并在两个数组之间执行逐个元素的and
。为了进行这种逐个元素的比较,它将在执行操作之前评估运算符两端的语句。您的语句等同于:
and(points.object == 5, points.x.^2 + points.y.^2 < r^2)
其中,对points.object == 5
和point.x.^2 + points.y.^2 < r^2
进行求值以生成logical
数组。
如果要将第二个组件的计算限制为条件的第一部分为true
的元素,则可以将其分解为多个语句,并使用第一个语句中的逻辑索引来确定计算第二个语句的元素。
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
进行平方。
% 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
https://stackoverflow.com/questions/41080400
复制相似问题