我正在运行以下代码以获取数据点处数据矩阵的反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,我称这个函数为几千次。有没有更快的方式来做这个?任何答案都表示赞赏。谢谢!
答案 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)