在Matlab中计算逆EDF的快速方法

时间:2014-04-26 12:03:17

标签: performance matlab

我正在运行以下代码以获取数据点处数据矩阵的反EDF值:

function [mOUT] = InvEDF (data)

% compute inverse of EDF at data values
% function takes T*K matrix of data and returns T*K matrix of transformed
% data, keepin the order of the original series

T = rows(data);
K = cols(data);
mOUT=zeros(T,K);

for j = 1:K 

    for i = 1:T
        temp = data(:,j)<=data(i,j);
        mOUT(i,j) = 1/(T+1)*sum(temp); 
    end

end

数据矩阵的大小通常为1000 * 10甚至1000 * 30,我称这个函数为几千次。有没有更快的方式来做这个?任何答案都表示赞赏。谢谢!

2 个答案:

答案 0 :(得分:0)

试试这个 -

mOUT=zeros(T,K);
for j = 1:K
    d1 = data(:,j);
    mOUT(:,j) = sum(bsxfun(@ge,d1,d1'),2); %%//'
end
mOUT = mOUT./(T+1);

答案 1 :(得分:0)

您可以对值进行排序,并使用排序矩阵中的索引作为小于或等于的值的计数。我们自己处理每一列,因此我将在Mx1矩阵上进行说明。

A = rand(M,1);
[B,I] = sort(A);
C(I) = 1:M;

C(i)现在将包含小于或等于A(i)的值的计数。如果您可以拥有重复值,则需要将其考虑在内。

这种方法的优点是我们可以在O(M log M)时间内完成,而你原来的内环是O(M ^ 2)