尝试构建我认为是列联表的列表,请考虑以下事项:
dist = Parallelize[Table[RandomVariate[NormalDistribution[]], {100000}]];
dist2 = Rest@FoldList[0.95 # + #2 &, 0, dist];
dist3 = Rest@FoldList[0.95 # + Abs[#2] &, 0, dist];
dist4 = {dist2, dist3}\[Transpose]
q1 = Flatten[{Quantile[dist2, {1/3, 2/3}], Quantile[dist3, {1/3, 2/3}]}]
{-1.39001, 1.33851, 15.0327, 16.6757}
我需要做什么:对于dist4的每个元素,我需要看到它下面的9个框属于:
for example : {1.55191, 15.7189} belongs to 2
1.55 belongs to 1 and
15.71 belongs to 8
So the intersection is 2.
我已经尝试过If或者Switch,但是要写很长时间。有自动方法吗?
答案 0 :(得分:3)
如果我理解这个问题,我认为这样做:
{a, b, c, d} = q1;
tbl = Range@9 ~Partition~ 3;
f[{x_, y_}] := tbl[[
Which[x > b, 1, x > a, 2, x <= a, 3],
Which[y < c, 1, y < d, 2, y >= d, 3]
]]
f /@ dist4 // Short
答案 1 :(得分:2)
y[t_] := Piecewise[{{7, t < q1[[1]]}, {4, t <= q1[[2]]}}, 1];
x[t_] := Piecewise[{{0, t < q1[[3]]}, {1, t <= q1[[4]]}}, 2];
{{##}, x[#1] + y[#2]} & @@@ dist4
或者使用BinLists
!:
k = BinLists[dist4,
{Join[{Min[dist4[[All, 1]]]}, q1[[1 ;; 2]], {Max[dist4[[All, 1]]]}]},
{Join[{Min[dist4[[All, 2]]]}, q1[[3 ;; 4]], {Max[dist4[[All, 2]]]}]}
];
Flatten[Replace[
Flatten[MapIndexed[{#1, #2} &, k, {2}], 1], {{x__}, t_} :>
(Join[{#}, {9 - 3 First@t + Last@t}] & /@ {x}), {1}], 1]
答案 2 :(得分:1)
您是否考虑过使用步进功能? 根据您是否希望在插槽8的情况下输出为{3,2},或实际上是数字8,实现可能会有所不同。
g1[x_] :=
Piecewise[{{1, x > 1.33851}, {2, 1.33851 >= x > -1.39001}, 3}]
g2[x_] := Piecewise[{{1, x < 15.0327}, {2, 15.0327 <= x < 16.6757}}, 3]
slotfn[{a_, b_}] := {g2[b], g1[a]}
slotnumber[{a_, b_}] := 3 g2[b] + g1[a]
如果belisarius的实现真的相同,我会删除。我会注意到,我的非功能性非#版本确保您只将两个参数传递给slotfn
或slotnumber
。
答案 3 :(得分:1)
使用单独的限制规范:
limits =
{
{.1, .15, .5, \[Infinity]},
{1, 2, 3, \[Infinity]}
};
cell[l_List] :=
Table[
Position[
limits[[i]], _?(# > l[[i]] &), 1, 1
][[1, 1]], {i, 1, Length@l}]
然后 cell[{.4, 1.5}]
会产生{3, 2}
。您可以转换为:
(cell[{.4, 1.5}] - {0, 1})*{1, Length[limits[[1]]]} // Plus @@ # &
产生7
。