如果我有A = [3 4 5 6]且B = [6 5 4]那么我想比较A中的每个值和B中的所有值, 如果此值更大,则将计数器增加1,如果此值相等,则增加另一个计数器1
答案 0 :(得分:2)
如果你想要一个与A
中每个值的结果相对应的数组,你可以这样做
arrayfun(@(x) sum(x > B), A)
这给了[0, 0, 1, 2]
。如果你想要总和,你只需将sum(...)
放在那个:
sum(arrayfun(@(x) sum(x > B), A))
这给了3
。
对于平等计数器,您只需将>
更改为==
:
arrayfun(@(x) sum(x == B), A)
这给了[0, 1, 1, 1]
。
答案 1 :(得分:0)
与arrayfun
相比的另一种方法是bsxfun
。虽然它需要更多的内存,但我认为它更快。 arrayfun
隐式地是for
循环,在MATLAB中使用循环通常比向量化方法慢。
如果您想要大于大小写,请将gt
函数与bsxfun
一起使用,以便:
>> A = [3 4 5 6];
>> B = [6 5 4];
>> sum(bsxfun(@gt, A, B.'), 1)
ans =
0 0 1 2
如果您想累积符合条件的所有值,可以在此sum
来电中添加另一个bsxfun
来电:
>> sum(sum(bsxfun(@gt, A, B.'), 1))
ans =
3
对于大于或等于的情况,请使用ge
:
>> sum(bsxfun(@ge, A, B.'), 1)
ans =
0 1 2 3
对于相等的情况,请使用eq
:
>> sum(bsxfun(@eq, A, B.'), 1)
ans =
0 1 1 1
同样,如果您想累积符合条件的所有值,请使用上述结果嵌套另一个sum
调用。