【问题标题】:Table/Tree of values值表/树
【发布时间】:2013-04-11 15:32:07
【问题描述】:

我的问题:

有没有办法创建一棵价值树? 类似于命令 TreeForm 的输出, 但在节点中有值?

我为什么要这个?

我正在尝试做一个完整的程序来分析我的实验课程的输出。 每列数据作为一个符号赋值。一般来说,每一列都是有意义的:它不仅仅是一堆不同的变量。我想说的是,总的来说,计算是“按列”完成的。我的问题是,当我需要进行需要更复杂的“水平”结构的计算时:将变量分配给列缺乏“水平灵活性”。 (在某种程度上,这是在 Excel 中使用$$ 和数组公式解决的问题)

让我用一个例子来说明:

y={1,2,3,4,5,6,7,8,9};
x={-1,-2,-3};

我想将 y 的 1;;3, 4;;8, 9;;9 部分与 x 的每个元素相关联。我所说的关联是指对于某些计算,函数的输入将作为每个集合的参数。

我知道 Map、Apply、Thread 和 MapThread 等函数。我一直在使用它们来解决这类问题,但有时会有点混乱。

我也知道分区,如果我想在相同长度的子数组中分隔 y,它将解决我的问题。

正如我在我的问题中所说,我想要的是构建一个类似网络/树的东西,它在我的计算的每个步骤中“归档”参数的结构。就像在网络理论中一样,当每个节点作为它与网络其余部分的连接的关联列表时。请注意,此列表不应包含值,而是包含连接节点的某种坐标

示例: 计算列表的不规则分割长度n={3,2,5}的均值和均方差

 y={3,5,8,7,9,4,6,2,1,5};

我的概念性方法:

我的表/树的第一列将是数据 y。要引用某个列上的某个值,我将使用一对坐标 i,j:i 代表列,j 代表内部位置。 我会将坐标 i=1 分配给 y。

对于均值计算,我有什么样的“计算连接”?

Yav=F1[y]=Mean[y]

均值列 Xav i=2 将包含 3 个元素。我为每个人分配一个连接列表给 y:

("" 的连接用 C"" 表示)

    CYav[[1]]: {1,{1,2,3}}
    CYav[[2]]: {1,{4,5}};
    CYav[[3]]: {1,{6,7,8,9,10}}

连接写成形式 {i,{j 的 i 的元素}}

现在,让我们计算均方偏差。也就是说,

   Ymsd=F2[y,Yav]=Mean[(y-Yav)^2]

此列为 i=3 以及 3 个元素。

对于这个计算,我想使用 i=1,2 列。与 y 的计算连接与用于计算 Yav 的连接相同。但现在,我需要将 Ymsd 连接到 Yav。

    CYmsd[[1]]: {{1,{1,2,3}},{2,1}}
    CYmsd[[2]]: {{1,{4,5}},{2,2}}
    CYmsd[[3]]: {{1,{6,7,8,9,10}},{2,3}}

现在连接是前一种类型的一对连接,每列连接一个。

分配连接后,我将使用一个函数来获取正确的值,在创建的地图的指导下,并应用 F1、F2。

【问题讨论】:

标签: tree wolfram-mathematica


【解决方案1】:

您想要做的大部分事情要么是非常特定于应用程序,要么是一种面向对象的数据结构和代码视图。

但首先,为了帮助您,这里有一个小工具,多年来一直在我的技巧包中,可以补充 Map、MapThread 和 Partition 来解决您的问题:

PartitionAs[k_List, c_List] := 
    Map[Take[k, #] &, 
         FoldList[Last[#1] + {1, #2} &, {1, First[c]}, Rest@c]]

PartitionAllAs[k_List, c_List] := 
    Map[Take[k, #] &, 
       If[Last[Last[#]] < Length[k], 
           Append[#, {Last[Last[#]] + 1, Length[k]}], #] &@
                 FoldList[Last[#1] + {1, #2} &, {1, First[c]}, Rest@c]]

这是他们所做的一个例子

PartitionAs[{a, b, c, d, e, f, g, h, i, j, k}, {1, 2, 5}]

{{a}, {b, c}, {d, e, f, g, h}}


PartitionAllAs[{a, b, c, d, e, f, g, h, i, j, k}, {1, 2, 5}]

{{a}, {b, c}, {d, e, f, g, h}, {i, j, k}}

它们没有内置检查(它们不会测试您发送给它们的零件长度列表是否与列表大小兼容等),因此是否正确取决于调用代码,但它们可能很方便为您的应用程序。他们也只能指定一个分区深度。可以想象其他指定分区的方法,并且从平面列表构建更通用的树生成例程并不是很困难。如果您需要这种东西,请告诉我们。

【讨论】:

  • 谢谢。这确实是我需要的那种东西。我在想一个更好的方法不是重建参数以满足我的需要,而是使用坐标列表来指定我想在特定计算中使用的元素。在我看来,这似乎更有效。但是,也许那不是这么好的主意,因为存储值的位置或副本在效率方面似乎没有太大区别
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-19
  • 2019-10-29
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多