gpt4 book ai didi

list - 没有 For 循环的单调化(列表调整)

转载 作者:行者123 更新时间:2023-12-03 21:20:29 26 4
gpt4 key购买 nike

Mathematica 代码中的 For 或 While 循环总是让我觉得有点脏,但我试图做一些类似函数的列表,我很困惑,并求助于这个:

(* # Given a list of {x,y} pairs, transform the data as follows: every time 
# there's a decrease in y-value from one datapoint to the next, say {x1,Y}
# followed by {x2,y}, add Y to the value of every datapoint on or after x2. *)
monotonify[data_] := Module[{data0, i, offset = 0},
data0 = data;
For[i = 2, i <= Length[data], i++,
If[data[[i-1,2]] > data[[i,2]], offset += data[[i-1,2]]];
data0[[i]] += {0,offset}];
data0]

(将 y 值视为里程表读数,有时里程表会意外重置 - 很明显,因为该值减少了,而里程表不应该这样做。因此,我们通过将每次重置之前的最后一个已知值添加到所有 future 值来转换读数.)

你会如何以漂亮的函数风格编写 monotonify?

(我不认为上述 For 循环完全正确的事实可能是一种温和的强制症。)

最佳答案

好的,现在我已经按照最初的要求修正了我处理输入的方法。

从示例数据集开始:

dataset = {{a, 1}, {b, 2}, {c, 3}, {d, 4}, {e, 5}, {f, 0}, {g, 4}, 
{h,5}, {i, 6}, {j, 7}, {k, 4}, {l, 7}, {m, 8}, {n, 9}, {o, 0}, {p,2},
{q, 3}};

采取转置:
trDataset = Transpose[dataset];

接下来是一个仅对 Y 值进行操作的函数:
trDataset[[2]] = FoldList[Plus, dataset[[1, 2]], Map[Max[#, 0] &, Differences[dataset[[All, 2]]]]]

撤消换位:
dataset = Transpose[trDataset]

输出现在是
{{a, 1}, {b, 2}, {c, 3}, {d, 4}, {e, 5}, {f, 5}, {g, 9}, {h, 10}, {i, 
11}, {j, 12}, {k, 12}, {l, 15}, {m, 16}, {n, 17}, {o, 17}, {p,
19}, {q, 20}}

我还没有测试这个解决方案的性能。

编辑: 好的,这是修复的基础,我会将其余的工作留给您@dreeves。此版本的 monotonify 仅适用于数字列表,我尚未将其集成到我之前的建议中以处理您的输入。
monotonify[series_] := 
Split[series, Less] //. {a___, x_List, y_List, z___} /;
Last[x] > First[y] -> {a, x, y + Last[x], z} // Flatten

编辑 2: 另一个适用于数字列表的函数。这比我之前的尝试要快得多。
monotonify[series_] := 
Accumulate[Flatten[Map[Flatten[{#[[1]], Differences[#]}] &,
Split[series, Less]]]]

关于list - 没有 For 循环的单调化(列表调整),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3305138/

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