我有一个行向量X,我想找到它的中位数。我使用MATLAB的函数median()来找到相同的结果,但它被证明是我代码中的瓶颈。在其他语言中是否有更快的实现方法来查找中位数?
X
median()
q0qdq0h21#
我能够将计算速度提高几个数量级,但不是通过不同的实现。相反,我只是将向量转换为gpuArray,然后输入median()函数。对于大的矢量,这减少了几个数量级的计算时间。但是对于较短的数组来说速度变慢了,我相信这是因为时间被用在了将矢量转移到gpu内存中。我发现矢量的过渡长度约为450。也就是说,对于短于450的向量,直接将向量馈送到median()函数中更好,对于较长的向量,转换为gpuArray,然后馈送到median()函数中更快。
gpuArray
lf5gs5x22#
EDIT:在注解之后,我更正了添加排序的功能。它实际上比内置的要慢。
x=7*rand(1,dim); tic median(x) toc tic s=size(x,2); x=sort(x); if mod(s,2)~=0 x((s+1)/2) else (x((s/2)+1)+x(s/2))/2 end toc
2条答案
按热度按时间q0qdq0h21#
我能够将计算速度提高几个数量级,但不是通过不同的实现。
相反,我只是将向量转换为
gpuArray
,然后输入median()
函数。对于大的矢量,这减少了几个数量级的计算时间。但是对于较短的数组来说速度变慢了,我相信这是因为时间被用在了将矢量转移到gpu内存中。我发现矢量的过渡长度约为450。也就是说,对于短于450的向量,直接将向量馈送到
median()
函数中更好,对于较长的向量,转换为gpuArray
,然后馈送到median()
函数中更快。lf5gs5x22#
EDIT:在注解之后,我更正了添加排序的功能。它实际上比内置的要慢。