可能重复:
C中的滚动中值算法
鉴于从数据流中读取整数.到目前为止,以有效的方式查找元素的中位数.
解决方案我已经读过:我们可以使用左侧的最大堆来表示小于有效中位数的元素,在右侧使用最小堆来表示大于有效中位数的元素.
在处理传入元素之后,堆中元素的数量最多相差1个元素.当两个堆包含相同数量的元素时,我们发现堆的根数据的平均值为有效中值.当堆不平衡时,我们从包含更多元素的堆的根中选择有效中值.
但是我们如何构建最大堆和最小堆,即我们如何知道这里的有效中位数呢?我认为我们会在max-heap中插入1个元素,然后在min-heap中插入下一个元素,依此类推所有元素.纠正我如果我错在这里.
使用data.table包实现滑动窗口函数的最佳(最快)方法是什么?
我正在尝试计算滚动中位数但每个日期有多行(由于2个额外的因素),我认为这意味着动物园rollapply函数不起作用.以下是使用naive for循环的示例:
library(data.table)
df <- data.frame(
id=30000,
date=rep(as.IDate(as.IDate("2012-01-01")+0:29, origin="1970-01-01"), each=1000),
factor1=rep(1:5, each=200),
factor2=1:5,
value=rnorm(30, 100, 10)
)
dt = data.table(df)
setkeyv(dt, c("date", "factor1", "factor2"))
get_window <- function(date, factor1, factor2) {
criteria <- data.table(
date=as.IDate((date - 7):(date - 1), origin="1970-01-01"),
factor1=as.integer(factor1),
factor2=as.integer(factor2)
)
return(dt[criteria][, value])
}
output <- data.table(unique(dt[, list(date, factor1, factor2)]))[, window_median:=as.numeric(NA)]
for(i in nrow(output):1) {
print(i)
output[i, window_median:=median(get_window(date, factor1, factor2))]
}
Run Code Online (Sandbox Code Playgroud) 像Max-heap和Min-heap一样,我想实现一个中值堆来跟踪给定整数集的中位数.API应具有以下三个功能:
insert(int) // should take O(logN)
int median() // will be the topmost element of the heap. O(1)
int delmedian() // should take O(logN)
Run Code Online (Sandbox Code Playgroud)
我想使用数组(a)实现来实现堆,其中数组索引k的子节点存储在数组索引2*k和2*k + 1中.为方便起见,数组开始从索引1填充元素.这是到目前为止我所拥有的:中间堆将有两个整数来跟踪到目前为止插入的整数的数量>当前中位数(gcm)和<当前中位数(lcm).
if abs(gcm-lcm) >= 2 and gcm > lcm we need to swap a[1] with one of its children.
The child chosen should be greater than a[1]. If both are greater,
choose the smaller of two.
Run Code Online (Sandbox Code Playgroud)
同样适用于其他情况.我无法想出如何沉入和游泳元素的算法.我认为它应该考虑到数字与中位数的接近程度,所以类似于:
private void swim(int k) {
while (k > 1 && absless(k, k/2)) {
exch(k, k/2);
k = …
Run Code Online (Sandbox Code Playgroud) 有谁知道在C中是否有一个干净的Turlach滚动中值算法实现?我在将R版本移植到干净的C版本时遇到了麻烦.有关算法的更多详细信息,请参见此处.
编辑:
正如darkcminor指出的那样,matlab有一个函数medfilt2
调用ordf
哪个是滚动顺序统计算法的ac实现.我相信算法比O(n ^ 2)快,但它不是开源的,我不想购买图像处理工具箱.
给定一系列数据(可能有重复数据),固定大小的移动窗口,从数据序列的开始每次迭代移动窗口,以便(1)从窗口中移除最旧的数据元素并且新的数据元素被推入窗口(2)在每次移动时找到窗口内数据的中值.
以下帖子没有帮助.
我的想法:
使用2堆来保持中位数.在窗口旁边,在第一次迭代中对窗口中的数据进行排序,最小堆保存较大的部分,最大堆保存较小的部分.如果窗口具有奇数个数据,则最大堆返回中值,否则两个堆的顶部元素的算术平均值是中值.
将新数据推入窗口时,从其中一个堆中删除最旧的数据,并将新数据与max和min堆的顶部进行比较,以便确定要将数据放入哪个堆.然后,找到中间值就像在第一次迭代中一样.
但是,如何在堆中查找数据元素是一个问题.堆是二叉树而不是二叉搜索树.
是否有可能用O(n)或O(n*lg m)求解它,其中m是窗口大小和空间:O(1)?
任何帮助都非常感谢.
谢谢
注意:我不是在询问Median Filter.
我有一系列图像让我们说:
std::array<cv::Mat,N> sequence;
Run Code Online (Sandbox Code Playgroud)
我想将所有这些图像合二为一.这一张图片应满足:
新图像的每个像素是来自序列的其对应像素的中值.换一种说法:
Result(i,j)=median(sequence[0](i,j), sequence[1](i,j), ..., sequence[N](i,j));
Run Code Online (Sandbox Code Playgroud)
这样做有内置功能吗?什么是最快的方式?
我到目前为止尝试过:迭代所有序列中的每个像素并排序然后取中位数然后将其存储在结果中.但是,这太过分了.
我是data.tables的新手,如果这是一个非常基本的问题,请道歉.
我听说data.tables在处理大量数据时显着提高了计算时间,因此希望看看data.table是否能够帮助加速rollapply函数.
如果我们有一些单变量数据
xts.obj <- xts(rnorm(1e6), order.by=as.POSIXct(Sys.time()-1e6:1), tz="GMT")
colnames(xts.obj) <- "rtns"
Run Code Online (Sandbox Code Playgroud)
一个简单的滚动分位数,宽度为100,ap为0.75需要相当长的时间......
即代码行
xts.obj$quant.75 <- rollapply(xts.obj$rtns,width=100, FUN='quantile', p=0.75)
Run Code Online (Sandbox Code Playgroud)
似乎永远......
data.table可以做些什么来加快速度?即是否有可以应用的通用滚动功能?
也许是一个例程,将xts对象转换为data.table对象,以加速的方式执行函数,然后在最后重新转换回xts?
提前致谢
HLM
ps我似乎没有在data.table邮件列表上得到太多响应,所以我在这里发帖,看看我是否得到了更好的回复.
pps快速使用数据帧的另一个例子data.table解决方案似乎需要比rollapply函数更长的时间,如下所示:
> x <- data.frame(x=rnorm(10000))
> x.dt <- data.table(x)
> system.time(l1 <- as.numeric(rollapply(x,width=10,FUN=quantile,p=0.75)))
user system elapsed
2.69 0.00 2.68
> system.time(l <- as.numeric(unlist(x.dt[,lapply(1:((nrow(x.dt))-10+1), function(i){ x.dt[i:(i+10-1),quantile(x,p=0.75)]})])))
user system elapsed
11.22 0.00 11.51
> identical(l,l1)
[1] TRUE
Run Code Online (Sandbox Code Playgroud) 我在2D中值滤波器(3x3窗口)中存在瓶颈,我在一组非常大的图像上使用,我想尝试优化它.我测试过scipy.ndimage
median_filter,以及PIL
,scipy.signal
和scikits-image
.然而,浏览SO我已经知道C中有一个快速的O(n)中值滤波器(恒定时间中的中值滤波,参见C中的滚动中值算法),我想知道我是否可以使用scipy在Python中实现它. weave.inline?有关替代路线的任何建议吗?
我正在寻找一个快速/有效的中值滤波器的Ansi C实现.有什么指针吗?
到目前为止,我已经找到了以下实现,这很好,但我对更快的实现感到好奇.我只需要一维.
我借用了一些代码,试图实现一个函数来计算大量数据的运行中位数。当前的对我来说太慢了(棘手的部分是我需要从正在运行的框中排除所有零)。下面是代码:
from itertools import islice
from collections import deque
from bisect import bisect_left,insort
def median(s):
sp = [nz for nz in s if nz!=0]
print sp
Mnow = len(sp)
if Mnow == 0:
return 0
else:
return np.median(sp)
def RunningMedian(seq, M):
seq = iter(seq)
s = []
# Set up list s (to be sorted) and load deque with first window of seq
s = [item for item in islice(seq,M)]
d = deque(s)
# Sort it in increasing …
Run Code Online (Sandbox Code Playgroud) 有人知道R中是否存在2d矩阵的滑动窗口方法,而不仅仅是向量.我需要将中值函数应用于存储在矩阵中的图像