1

在 Chapel 中,我可以将等于给定值的数组元素的数量计算为

var a = [1,2,5,5,5];
writeln( a.count( 5 ) );  // this gives 3

但类似的方法似乎不适用于计算真实元素的数量:

writeln( count( a > 1 ) );
writeln( ( a > 1 ).count( true ) );

在这种情况下,我是否需要编写一个显式的 for 循环,或者是否有任何其他函数(或方法)用于此目的......?


更新

经过更多的实验,似乎如果我将结果保存a == 5到一个新数组

var mask = ( a == 5 );

然后它按预期工作

writeln( mask.count( true ) );  // gives 3

那么,a == 5可能代表与数组对象不同的东西,因此不.count()直接提供?

4

1 回答 1

2

您遇到的问题是该.count()方法是在数组上定义的,因此调用它就可以了a。但是,表达式a > 1不是数组,它是迭代器表达式,并且迭代器表达式(当前)不支持该.count()方法,也不强制转换为数组(参见*)。
所以这个问题与计算布尔值没有任何关系。
如果您计算数组上的其他提升表达式,您会遇到类似的问题:

var a = [ 1, 2, 5, 5,  5],
    b = [ 2, 4, 6, 8, 10];

writeln( ( a + b ).count( 6 ) );

解决这个问题的两种不令人满意的方法是

(1) 将迭代器表达式转换为数组或
(2) 将迭代器表达式存储到数组变量中。
但在 Chapel 中编写此表达式的更典型方法是使用归约:

writeln( + reduce ( a > 1 ) );

*) = 也许这些事情之一应该改变......

于 2017-05-12T00:22:54.690 回答