用MATLAB实现两个向量的计数

用MATLAB实现两个向量的计数,matlab,Matlab,我试着编译下面的代码,但不起作用。基本上,我想计算a中小于或等于x中每个元素的元素数。请帮忙 a = exprnd(1,10000, 1); x = 0:0.02:10; for i = 1:length(x); count = 0; for j = 1:length(a); if (a(j) <= x(i)) count = count + 1; end end end a=exprnd(110000,1);

我试着编译下面的代码,但不起作用。基本上,我想计算a中小于或等于x中每个元素的元素数。请帮忙

a = exprnd(1,10000, 1);
x = 0:0.02:10;
for i = 1:length(x);
    count = 0;
    for j = 1:length(a);
        if (a(j) <= x(i))
          count = count + 1;
        end
    end
end
a=exprnd(110000,1);
x=0:0.02:10;
对于i=1:长度(x);
计数=0;
对于j=1:长度(a);

如果(a(j)使用矢量化的简单方法:

 count=zeros(length(x),1);  
 for ii=1:length(x)
       count(ii)=count(ii)+sum(a<=x(ii));
 end
count=0(长度(x),1);
对于ii=1:长度(x)
count(ii)=count(ii)+sum(a在您的情况下,可以使事情变得更简单

您可以尝试以下方法:

result = sum(bsxfun(@le, a(:), x(:).'));
让你的方法发挥作用: 首先,我们修正您最初的方法:

a = exprnd(1,10000, 1);
x = 0:0.02:10;
count = zeros(size(x)); %%// <= Preallocate the count-vector
for i = 1:length(x);
    %%// <= removed the line "count = 0"
    for j = 1:length(a);
        if (a(j) <= x(i))
          count(i) = count(i) + 1; %%// <= Changed count to count(i)
        end
    end
end
这种方法可能更难掌握,但对于大型向量,您将获得相当大的加速

使用
排序
进行
的类似方法: 这种方法的概念非常相似,但使用循环更为传统: 首先我们对
x
a
进行排序。然后我们通过
x(i\ux)
。如果
x(i\ux)
它大于当前的
a(i\u a)
,我们增加
i_a
。如果它小于当前的
i_a
,则
i_a-1
a
中小于或等于
x(i_x)
的元素数

比较: 下面是您的方法的运行时比较,Ander Biguri的
for+sum
循环方法,mehmet的
bsxfun
方法,使用
sort
histc
方法的两种方法: 对于长度为16384的向量,
histc
方法比原始方法快2300倍。

我认为
bsxfun
是我唯一不用的Matlabs功能之一,每次我在中阅读答案时,我都会对自己说:伙计,你大错特错了!答案太棒了。@AnderBiguri-当你用过一次,你永远不会放弃,请确保((:
bsxfun
我经常使用。它在图像过滤中非常有用。我从Divakar那里学会了如何有效地使用它:)。顺便说一句,+1。@rayryeng-我们这里有大师:D这是一个非常有用的函数,与一行命令一样可以处理循环。@mehmet-我同意:)我还建议学习的一个功能是
accumarray
。我从chappjc学习了如何使用它,以及我想出的许多优雅的解决方案。我最喜欢的功能之一是计算两幅图像之间的联合熵:我认为
零(长度(x))
是一个错误,因为它会生成一个方阵。您可以使用
零(大小(x));
相反。哦!我想这可以通过
cumsum
histc
来完成。另外:我感觉您可能真的在寻找。请澄清此应用程序,以便我们可以将问题标题更改为更易于未来用户搜索的内容。类似的问题:,,还有numpy函数做了类似的事是的..试着得到cdf@Divakar:可能有点太多了,但推动解决方案会让人上瘾我仍在试图为这个问题找到一个更好的标题和描述,以防将来有人想搜索…:-寻找替代解决方案,也许比已经发布的更有效,在过程中学习是人们可以学习的最好的东西之一。你对标题的看法是对的,它需要一个标题e目前具有更具代表性的性质。
function aSmallerThanxMat = aSmallerThanx(a, x)
%%// Remember dimension of x
dimX = size(x);
%%// Sort x and remember original ordering Ix
[xsorted, Ix] = sort(x(:));
%%// How many as are smaller than sortedX
[~,Iaxsorted] = sort([a(:); xsorted(:)]);
Iaxsortedinv(Iaxsorted) = 1:numel(Iaxsorted);
aSmallerThanSortedx = Iaxsortedinv(numel(a)+1:end)-(1:numel(xsorted));
%%// Get original ordering of x back
aSmallerThanx(Ix) = aSmallerThanSortedx;
%%// Reshape x to original array size 
aSmallerThanxMat = reshape(aSmallerThanx, dimX);
function aSmallerThanx = aSmallerThanx(a, x)
asorted = sort(a(:));
[xsorted, Ix] = sort(x(:));
aSmallerThanx = zeros(size(x));

i_a = 1;
for i_x = 1:numel(xsorted)
    for i_a = i_a:numel(asorted)+1
        if i_a>numel(asorted) || xsorted(i_x)<asorted(i_a)
            aSmallerThanx(Ix(i_x)) = i_a-1;
            break
        end
    end
end
function result = aSmallerThanx(a, x)
[xsorted, Ix] = sort(x(:));
bincounts = histc(a, [-Inf; xsorted]);
result(Ix) = cumsum(bincounts(1:end-1));