gpt4 book ai didi

wolfram-mathematica - 有没有更快的方法来找到最小值和最大值?

转载 作者:行者123 更新时间:2023-12-04 10:30:09 26 4
gpt4 key购买 nike

我经常写:{Min@#, Max@#} &
然而这似乎是低效的,因为表达式必须被扫描两次,一次是为了找到最小值,一次是为了找到最大值。有没有更快的方法来做到这一点?表达式通常是张量或数组。

最佳答案

这比它好一点。

minMax = Compile[{{list, _Integer, 1}},
Module[{currentMin, currentMax},
currentMin = currentMax = First[list];
Do[
Which[
x < currentMin, currentMin = x,
x > currentMax, currentMax = x],
{x, list}];
{currentMin, currentMax}],
CompilationTarget -> "C",
RuntimeOptions -> "Speed"];
v = RandomInteger[{0, 1000000000}, {10000000}];
minMax[v] // Timing

我认为它比 Leonid 的版本快一点,因为 DoFor 快一点,即使在编译代码中。

不过,最终,这是您在使用高级函数式编程语言时所遭受的那种性能损失的一个例子。

针对列昂尼德的补充:

我不认为该算法可以解释所有的时间差异。我认为,通常情况下,无论如何都会应用这两种测试。 Do的区别和 For然而,是可衡量的。
cf1 = Compile[{{list, _Real, 1}},
Module[{sum},
sum = 0.0;
Do[sum = sum + list[[i]]^2,
{i, Length[list]}];
sum]];
cf2 = Compile[{{list, _Real, 1}},
Module[{sum, i},
sum = 0.0;
For[i = 1, i <= Length[list],
i = i + 1, sum = sum + list[[i]]^2];
sum]];
v = RandomReal[{0, 1}, {10000000}];
First /@{Timing[cf1[v]], Timing[cf2[v]]}

{0.685562, 0.898232}

关于wolfram-mathematica - 有没有更快的方法来找到最小值和最大值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5883603/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com