鉴于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
答案 0 :(得分:3)
bsxfun
和sum
达到您想要的效果:
>> 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
。假设sum
和B
仅由整数组成,请执行:
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