是否有这样的东西
af::array groupedMax= af::Max(myValues, fromIndices, toIndices);
例如,
myValues= {random values}
fromIndices = {2, 7, 5}
toIndices = {10, 9, 12}
结果应为
groupedMax[0] will be max between myValues[2] and myValues[10]
groupedMax[1] will be max between myValues[7] and myValues[9]
groupedMax[2] will be max between myValues[5] and myValues[12]
这是可以实现的吗?如果没有,任何想法如何在arrayfire上超快做这个?
编辑:这是我想实现的粗糙单线代码。
vector<double> groupedMaxValues(fromIndices.size());
for(int g=0; g<fromIndices.size(); g++)
{
double maxVal = 0;
for(int i=fromIndices[g]; i<=toIndices[g]; i++)
{
if(maxVal < myValues[i])
{
maxVal = myValues[i];
}
}
groupedMaxValues[g] = maxVal;
}
我不知道分组的最大值是什么,但是可以使用以下
在两个AF ::数组之间的最大操作进行操作af::array a = myValues(fromIndices);
af::array b = myValues(toIndices);
af::array cond = a > b;
af::array mxd = cond * a + (1 - cond) * b;
在上面的示例中,两个输入a
&amp;b
只是myValues
的索引数组。
更新:( 2019年6月6日(在Bobodev对此答案的最新评论之后,这是我根据您的说明提出的代码,并提供了正确的输出(在代码之后显示(
float v[] = {10.0f, 30.0f, 20.0f};
af::array myValues(3, 1, v);
int f4m[] = {10};
int to[] = {12};
af::array fromIndices(1, f4m);
af::array toIndices(1, to);
af_print(myValues);
af_print(fromIndices);
af_print(toIndices);
af::array a = myValues(fromIndices);
af::array b = myValues(toIndices);
af::array cond = a > b;
af::array mxd = cond * a + (1 - cond) * b;
af_print(mxd);
样品的输出
myValues
[3 1 1 1]
10.0000
30.0000
20.0000
fromIndices
[1 1 1 1]
10
toIndices
[1 1 1 1]
12
mxd
[1 1 1 1]
30.0000
对不起,我对原始描述感到困惑。您的串行代码以更好的方式解释Q。
我认为您正在寻找的是AF :: ScanbyKey -http://arrayfire.org/docs/group __scan __scan __func__func__scanbykey.htm-尽管我尚不确定如何为您的用例生成钥匙作为inteces范围(作为interes范围(从头开始(似乎重叠。范围的长度似乎也不相同。