如何将一组数字与几个给定的数字进行比较?更确切地说,我有一个像这样的数组
inputArray = [1 2 2 3 4 6]
我希望将inputArray与数字1:7进行比较,以最终计算" 1"在inputArray中,a" 2",a" 3"等等。
显然我可以做类似
的事情res = zeros(7,1);
for i = 1:7
res(i) = sum(inputArray == i);
end
或更一般地,当我也可能对事件的位置感兴趣时
res = zeros(7,length(inputArray));
for i = 1:7
res(i,:) = inputArray == i;
end
res2 = sum(res,1);
出于好奇心和/或速度方面的改进,我想知道如果没有for循环的话,这是否可行?
答案 0 :(得分:3)
您似乎正在寻找直方图计数,请参见此处:
x = [1 3 10 1 8]
b = [1 2 3]
histc(x,b)
将产生
[2 0 1]
答案 1 :(得分:2)
如果您想要更多的矢量化维度而不是内置于您正在使用的函数中,或者想要将简单循环折叠为函数调用,则可以使用bsxfun
(" Binary Singleton eXpansion FUNction")。它非常通用,速度相当快,并且可以生成简洁的代码。
在这种情况下,您可以使用它来构造相等网格,然后将它们相加。
a = [1 2 2 3 4 5];
i = [1:7]'; % Flip it so it's oriented perpendicular to a
res = bsxfun(@eq, a, i);
counts = sum(res,2)'; %'
% One-liner version
counts = sum(bsxfun(@eq, a, [1:7]'), 2)';
虽然在您正在使用的特定情况下,由于您在原始数组上进行简单的算术运算,for
循环实际上可能是JIT优化最快的,只要您&# 39;小心地将工作隔离在自己的功能中,这样JIT就可以“就地”进行工作。优化
答案 2 :(得分:2)
另一种可能性:使用accumarray
:
count = accumarray(inputArray(:), 1, [7 1]); %// Change "7" as needed