Ton*_*ony 4 matlab sum histogram
例如,如果
A = [7,8,1,1,2,2,2]; % the bins (or subscripts)
B = [2,1,1,1,1,1,2]; % the array
Run Code Online (Sandbox Code Playgroud)
然后所需的功能"binsum"有两个输出,一个是箱子,另一个是总和.它只是根据A中的下标在B中添加值.例如,对于2,总和是1 + 1 + 2 = 4,对于1,它是1 + 1 = 2.
[bins, sums] = binsum(A,B);
bins = [1,2,7,8]
sums = [2,4,2,1]
Run Code Online (Sandbox Code Playgroud)
"箱"中的元素不需要排序,但必须与"总和"中的元素相对应.这肯定可以通过"for"迭代来完成,但是不希望"for"迭代,因为存在性能问题.最好是为此建立功能.
非常感谢!
这是另一项工作 accumarray
A = [7,8,1,1,2,2,2]; % the bins (or subscripts)
B = [2,1,1,1,1,1,2]; % the array
sums = accumarray(A.', B.').';
bins = unique(A);
Run Code Online (Sandbox Code Playgroud)
结果:
>> bins
bins =
1 2 7 8
sums =
2 4 0 0 0 0 2 1
Run Code Online (Sandbox Code Playgroud)
索引in sums对应于bin值,所以sums(2) = 4.您可以使用nonzeros删除未使用的箱子,以便bins(n)对应sums(n)
sums = nonzeros(sums).';
sums =
2 4 2 1
Run Code Online (Sandbox Code Playgroud)
或者,sums在一行中生成这种形式:
sums = nonzeros(accumarray(A.', B.')).';
Run Code Online (Sandbox Code Playgroud)
假设A包含正整数,
[bins, ~, sums] = find(sparse(A, 1, B));
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为sparse自动为匹配位置添加值(第三个输入)(由前两个输入定义).
如果A可以包含任意值,则还需要调用unique,并且find可以替换为nonzeros:
[bins, ~, labels]= unique(A);
sums = nonzeros(sparse(labels, 1, B));
Run Code Online (Sandbox Code Playgroud)