一次将数组与多个数字进行比较

时间:2014-05-20 09:53:16

标签: matlab

如何将一组数字与几个给定的数字进行比较?更确切地说,我有一个像这样的数组

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循环的话,这是否可行?

3 个答案:

答案 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