1

我的问题:

有没有办法创建一棵价值树?类似于命令 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 代表内部位置。我将为 y 分配坐标 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's of the elements of 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。

4

1 回答 1

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}}

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

于 2013-04-12T04:50:10.260 回答