表/值树

时间:2013-04-11 15:32:08

标签: tree wolfram-mathematica

我的问题:

有没有办法创建价值树? 类似命令TreeForm的输出, 但是节点中的值是什么?

为什么我要这个?

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

让我说明一个例子:

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

我想将1 ;; 3,4 ;; 8,9 ;; y的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。

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

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的元素}}}

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

   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。

1 个答案:

答案 0 :(得分:0)

您要做的很大一部分是非常特定于应用程序,或者更像是一种面向对象的数据结构和代码视图。

但是在第一个近似中,为了帮助你,这里有一个小工具,这个工具多年来一直在我的技巧包中,并将为你的问题补充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}}

他们没有内置支票(他们不会测试你发送的部件长度列表是否与列表大小兼容等)因此,调用代码是正确的,但它们可能很方便为您的应用程序。此外,他们只能指定一个分区深度。可以想象指定分区的其他方法,并且从平面列表构建更一般的树制作例程并不是很困难。告诉我们你是否需要这种东西。