PDL成对行比较

时间:2011-12-21 19:30:19

标签: perl pdl

我创建了一个PDL矩阵。我需要在每一行之间进行成对比较。目前我使用'where'和'cov'命令返回两个切片的成对比较(在perl循环中生成)。

我的问题:如何使用'range'和'slice'以成对的方式循环遍历行?我怎样才能返回我的指数位置?我使用perl在矩阵上循环。我已经读过用perl循环真的削弱了PDL的力量。

期望的输出:

indexA indexB Value
pos1   pos5   1
pos1   pos6   5
pos1   pos0   7 

要清楚我只想使用PDL功能。

这是一些伪代码(希望)更好地说明我的观点。

p $b

[
 [1 0 3 0]
 [0 1 0 1]
 [1 3 1 3]   <- example piddle y
 [0 1 0 1]   <- example piddle z
]

my concept function{


slice $b (grab row z) - works fine
slice $b (grab row y) - works fine


($a, $b) = where($a,$b, $a < 3 && $b < 3 ) - works fine

p $a [1 1] 
p $b [0  0] 

cov($a $b) - works just fine.

}

我只需要一种跨所有行成对执行的方法。我需要进行阶乘(n行)比较。

2 个答案:

答案 0 :(得分:1)

PDL线程是您在这里寻找的概念。沿着维度循环的一般技术是在适当的位置添加虚拟维度,以便计算生成所需的隐式线程循环。对于多维问题,可以有许多不同的方法来添加dim,从而创建threadloops。

对于成对行计算,您可以在切片索引上选择两个嵌套循环,这两个索引在两个索引计数上具有perl循环,并将沿着行生成PDL线程。您只能在索引上使用一个perl循环,但可以利用隐式线程来一次计算所有行。

完全PDL-threadloop计算将为每个参数的行添加一个虚拟维度,以便您一次计算整个N ** 2行计算。下面是一个shape [4,3]数组的示例,其计算结果为==运算符:

pdl> $b = floor(random(4,3)*5)

pdl> p $b

[
 [0 4 3 3]
 [3 3 4 2]
 [4 0 1 4]
]

pdl> p $b(,*3)==$b(,,*3)

[
 [
  [1 1 1 1]
  [0 0 0 0]
  [0 0 0 0]
 ]
 [
  [0 0 0 0]
  [1 1 1 1]
  [0 0 0 0]
 ]
 [
  [0 0 0 0]
  [0 0 0 0]
  [1 1 1 1]
 ]
]

结果是一个形状[4,3,3],其第0维对应于成对计算得到的行,第1和第2个对应于==操作中涉及的行索引。

如果您需要来自或用于其中一个threadloop计算的索引值,请使用 xvals yvals zvals axisvals 生成一个具有与该数组轴对应的索引值的小提琴。

pdl> p $b->xvals

[
 [0 1 2 3]
 [0 1 2 3]
 [0 1 2 3]
]


pdl> p $b->yvals

[
 [0 0 0 0]
 [1 1 1 1]
 [2 2 2 2]
]

有许多与PDL线程的实现有关的细节(与perl线程或posix线程不同)。我建议perldl mailing list与其他PDL用户和开发人员进行参考和讨论。另外,请参阅PDL Book的第一个在线草案,该草案对PDL计算和线程有更全面的报道。

答案 1 :(得分:0)

我认为您正在寻找的是一种方法,可以在数组中查找所有不同的行对,然后使用cov处理每对行?如果这是正确的,那么我没有听说过cov,快速搜索文档也无济于事。但是,我可以说一些可能有用的事情。

我认为你过度谨慎地将PDL放入Perl代码中,如果您所做的只是循环遍历所有行对的索引并使用{{{ 1}}。这在下面的一些示例代码中显示。

此外,您不能像slice那样调用where,因为它们本身就是小问题而布尔运算符不会对它们执行您想要的操作。请改用$a < 3运算符,并添加一些括号以确保表达式以正确的顺序执行。

除此之外我无法帮助,除非你纠正我对你的问题的理解或指导我对&子程序的一些文档。

cov