2011-03-09 66 views
1

我想使用Statistics::Basic::ComputedVectorset_filter,但我想要使用的过滤器是1和0的数组。这可能吗?如何根据Statistics :: Basic :: ComputedVector中的数组过滤矢量?

这就是我想做的事:

my $v1 = vector(1,2,3,4,5); 
my @filter = qw(1 0 0 1 1); 
my $cv = computed($v1); 
$cv->set_filter(@filter); 

我试过如下:

my $v1 = vector(1,2,3,4,5); 
my $compV1 = computed($v1); 
my @filter = (1) x $compV1->query_size(); 
$filter[-1] = 0; 
say $compV1; 
$compV1-> set_filter(sub { grep { $filter[$_] } 0..$#_ }); 
say $compV1; 

...但这打印:

[1, 2, 3, 5, 7] 
[0, 1, 2, 3] 

我应该怎么办?

看来这是一个问题,因为我对grepmap的了解超过了Statistics::Basic,所以我想你可以帮助即使你从未使用过这个模块。

回答

1

试试这个过滤器:

$compV1->set_filter(sub { map { $filter[$_] ? $_[$_] :() } 0..$#_ }); 

你的第二次尝试接近,但你正在返回指标,而不是真正的价值。

+0

这不会打印一个0和1的数组......为什么不只是'$ compV1-> set_filter(sub {map {$ filter [$ _]} @_});'?或者'$ compV1-> set_filter(sub {map {$ filter [$ _] + 0} @_});' – reinierpost 2011-03-09 17:15:23

+1

@reinierpost - 我对OP的理解是过滤器应该选择这些值'$ v1',其中'@过滤器“设置为1.我可能会错误地选择它。 – bvr 2011-03-09 17:44:24

+0

这不是它说的,但总是给OP超过/他要求:-) – reinierpost 2011-03-09 18:07:53

2
->set_filter(sub { @_[ grep $filter[$_], 0..$#_ ] }) 
+0

也有效。谢谢。 – flies 2011-03-09 20:51:36

+0

+1好切片 – bvr 2011-03-11 09:47:44