我需要使用Iman-Conover方法来模拟高维联合分布。速度至关重要。瓶颈之一归结为以下问题:给定一个大小相同的排序数组x
和一个未排序数组y
,如何有效地对x
重新排序,使得x
和y
是完全相关的。
直接,我做到了
template<typename indtype, typename valtype>
struct compare
{
valtype *a;
compare(valtype *a): a(a){}
bool operator() (indtype i, indtype j) { return a[i] < a[j]; }
};
// `xReordered` stores the result.
// `recycle` is an auxiliary container storing indices.
template<typename indtype, typename valtype>
void reorder(valtype *x, indtype xsize, valtype *y,
valtype *xReordered,
std::vector<indtype> &recycle)
{
recycle.resize(xsize);
for(indtype i = 0; i < xsize; ++i) recycle[i] = i;
std::sort(recycle.begin(), recycle.end(),
compare<indtype, valtype> (y));
for(indtype i = 0; i < xsize; ++i)
xReordered[recycle[i]] = x[i];
}
有更快的方法吗?我认为排序是必要的,可能会占总时间成本,但是没有辅助容器recycle
是否可以做到?
谢谢!