gpt4 book ai didi

c - C 中的滚动中位数 - Turlach 实现

转载 作者:太空狗 更新时间:2023-10-29 16:33:57 26 4
gpt4 key购买 nike

有谁知道在 C 中是否有 Turlach 滚动中值算法的干净实现?我在将 R 版本移植到干净的 C 版本时遇到问题。参见 here有关该算法的更多详细信息。

编辑:正如 darkcminor 指出的那样,matlab 有一个函数 medfilt2 调用 ordf 这是滚动顺序统计算法的 c 实现。我相信该算法比 O(n^2) 更快,但它不是开源的,我不想购买图像处理工具箱。

最佳答案

我已经实现了 rolling median calculator in C here (Gist) .它使用 max-median-min 堆结构:中位数位于 heap[0](位于 K-item 数组的中心)。从 heap[1] 开始有一个 minheap,在 heap[-1] 有一个 maxheap(使用负索引)。
它与 Turlach implementation from the R source 不完全相同:这个支持即时插入值,而 R 版本一次作用于整个缓冲区。但我相信时间复杂度是一样的。它可以很容易地用于实现整个缓冲区版本(可能添加一些代码来处理 R 的“endrules”)

接口(interface):

//Customize for your data Item type
typedef int Item;
#define ItemLess(a,b) ((a)<(b))
#define ItemMean(a,b) (((a)+(b))/2)

typedef struct Mediator_t Mediator;

//creates new Mediator: to calculate `nItems` running median.
//mallocs single block of memory, caller must free.
Mediator* MediatorNew(int nItems);

//returns median item (or average of 2 when item count is even)
Item MediatorMedian(Mediator* m);

//Inserts item, maintains median in O(lg nItems)
void MediatorInsert(Mediator* m, Item v)
{
int isNew = (m->ct < m->N);
int p = m->pos[m->idx];
Item old = m->data[m->idx];
m->data[m->idx] = v;
m->idx = (m->idx+1) % m->N;
m->ct += isNew;
if (p > 0) //new item is in minHeap
{ if (!isNew && ItemLess(old, v)) { minSortDown(m, p*2); }
else if (minSortUp(m, p)) { maxSortDown(m,-1); }
}
else if (p < 0) //new item is in maxheap
{ if (!isNew && ItemLess(v, old)) { maxSortDown(m, p*2); }
else if (maxSortUp(m, p)) { minSortDown(m, 1); }
}
else //new item is at median
{ if (maxCt(m)) { maxSortDown(m,-1); }
if (minCt(m)) { minSortDown(m, 1); }
}
}

关于c - C 中的滚动中位数 - Turlach 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5527437/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com