2011-03-09 65 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