计算另一个数组matlab

时间:2015-05-26 15:46:52

标签: arrays matlab

鉴于C中的值,我想计算在向量B中遇到这些值的次数。例如,如果C = [1 2],我想通过检查数组C的元素来计算B中有多少“1”和B中有多少“2”。

但是,我的代码似乎最多可以计算5,但真正的输出应该是1的数量是2而2的数量是3。

我写的代码如下所示。任何帮助肯定会受到赞赏。

我的代码:

 B = [ 1 2 1 4 5 2 2 ]
 C = [ 1 2 ]

 lb = length(B)
 lc = length(C)

for i = 1:length(B)
    for j = 1:length(C)
      if B(1,i)==C(1,j)
          c=c+1
          A(i)=c
      end 
    end
end

2 个答案:

答案 0 :(得分:3)

如果你想坚持使用循环,Santhan Salai会给出正确答案。但是,为了提高效率,如果您不想循环播放,则可以使用bsxfunsum达到您想要的效果:

>> B = [ 1 2 1 4 5 2 2 ];
>> C = [ 1 2 ];
>> D = sum(bsxfun(@eq, B, C.'), 2)

D =

     2
     3

bsxfun是一个很好的工具,允许您跨单个维度广播数据。在我们的例子中,我使用equals函数来检查元素相等,并转换C以使其成为列向量。将生成的是一个矩阵,其中我们有C中的行数和B中的列数。此输出矩阵的每一行都会告诉您哪些元素与C中的每个对应元素相等。 C 已广播,这样我们就可以获得一堆[1;2]列的矩阵,这些列与B和{{1}中的元素一样多。我们广播了B的重复次数与B中的行数一样多。通过逐元素相等,我们将生成一个逻辑矩阵,其中一行的每个元素都告诉您哪些元素等于C的对应值。您现在要做的就是对列进行求和,以获得C中每个值等于多少元素,从而调用第二维上的C

如果你想要矫枉过正,你也可以使用accumarray。假设sumB仅由整数组成,请执行:

C

然而,这会计算>> B = [ 1 2 1 4 5 2 2 ]; >> C = [ 1 2 ]; >> D = accumarray(B.', 1); D = 2 3 0 1 1 中所有唯一值的频率,因此您只需要B中的前两个条目。

另一种选择是使用histc

D

您基本上计算的是指定区间的>> B = [ 1 2 1 4 5 2 2 ]; >> C = [ 1 2 ]; >> D = histc(B, C) D = 2 3 直方图,用B表示。

答案 1 :(得分:1)

使用arrayfun可能是循环的替代

out = arrayfun(@(x) sum(ismember(B,x)), C)

这是你的纠正循环

count = zeros(1,numel(C));
for ii = 1:numel(C)
    for jj = 1:numel(B)
        if (C(ii) == B(jj))
            count(ii) = count(ii) + 1;
        end
    end
end