计算 bool 数组中真正元素的数量
Counting the number of true elements in a bool array
在 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()
?
您遇到的问题是 .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 ) );
*) = 也许这些事情之一应该改变......
在 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()
?
您遇到的问题是 .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 ) );
*) = 也许这些事情之一应该改变......