Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 修改数组的选定元素_C_Indexing_Blas - Fatal编程技术网

C 修改数组的选定元素

C 修改数组的选定元素,c,indexing,blas,C,Indexing,Blas,我知道我可以使用以下代码修改选定元素: int* idx = ... float* x = ... float* a = ... for (int i=0; i<N; i++){ x[idx[i]] = a[i]; } 但我知道人们已经花了很多时间优化像这样的简单循环。我试着在文档中查找,但没有找到修改select元素的函数 我发现函数的作用基本上与我想要的相反。什么函数会基于另一个数组修改数组中的选定元素?请记住,优化和非优化之间并没有那么黑和白;最糟糕的情况是,你总是可以将自

我知道我可以使用以下代码修改选定元素:

int* idx = ...
float* x = ...
float* a = ...
for (int i=0; i<N; i++){
    x[idx[i]] = a[i];
}
但我知道人们已经花了很多时间优化像这样的简单循环。我试着在文档中查找,但没有找到修改select元素的函数


我发现函数的作用基本上与我想要的相反。什么函数会基于另一个数组修改数组中的选定元素?

请记住,优化和非优化之间并没有那么黑和白;最糟糕的情况是,你总是可以将自己矢量化。是你想用的;其他图书馆包括

查看并运行以下代码,使用两个单独的构建并取消注释相应的部分

NSLog(@"Start");

//dispatch_async(dispatch_get_main_queue(), ^{
    for (int i=0; i<N; i++){
        x[j[i]] = b[i];
    }
//});

NSLog(@"End");

我们双向都有3.1秒。假设我举的wikipedia示例没有任何简单的打字错误,我猜编译器会将这个简单循环优化到极致(特别是考虑到我的优化标志,
-Ofastest

idx[]
是一个查找表吗?我不确定总体上是否可以进行任何优化。您可以尝试强制预取
idx
a
,但在这种简单的情况下,这可能已经完成了。序列
idx[I]
满足任何特殊属性吗?@FiddlingBits不,它只是一个
int*
。查找表也可以工作吗?我会看什么函数?@Pradhan不,没有特殊属性。@Scott
x
a
的索引之间没有一一对应的关系,对吗?例如,你怎么知道
I
呢de>3,从
a[3]
读取并存储在
x[10]
,假设
idx[3]==10
。也许我只是误解了这个问题。。。
NSLog(@"Start");

//dispatch_async(dispatch_get_main_queue(), ^{
    for (int i=0; i<N; i++){
        x[j[i]] = b[i];
    }
//});

NSLog(@"End");
dispatch_async:
2014-07-25 21:12:23.509 swix[15390:303] Start
2014-07-25 21:12:26.649 swix[15390:303] End

Serial:
2014-07-25 21:12:55.719 swix[15428:303] Start
2014-07-25 21:12:58.860 swix[15428:303] End