我想对不同时间戳的向量进行对齐和计数,以计算相应的区间。
假设我在[N,edges] = histcounts中有3个矩阵,如下所示。第一行代表边缘,因此是分档。第二行代表值。我想用相同的bin加总所有值。
A = [0 1 2 3 4 5;
5 5 6 7 8 5]
B = [1 2 3 4 5 6;
2 5 7 8 5 4]
C = [2 3 4 5 6 7 8;
1 2 6 7 4 3 2]
现在我要总结所有相同的箱子。我的最终结果应该是:
result = [0 1 2 3 4 5 6 7 8;
5 7 12 16 ...]
我可以遍历所有数字,但我想快点。
答案 0 :(得分:4)
您可以使用accumarray:
H = [A B C].'; %//' Concatenate the histograms and make them column vectors
V = [unique(H(:,1)) accumarray(H(:,1)+1, H(:,2))].'; %//' Find unique values and accumulate
V =
0 1 2 3 4 5 6 7 8
5 7 12 16 22 17 8 3 2
注意:H(:,1)+1
是强制bin值为正,否则MATLAB会抱怨。我们仍然在输出V
中使用实际的bin。为避免这种情况,正如@Daniel在评论中所说,使用third output of unique
(请参阅:https://stackoverflow.com/a/27783568/2732801):
H = [A B C].'; %//' stupid syntax highlighting :/
[U, ~, IU] = unique(H(:,1));
V = [U accumarray(IU, H(:,2))].';
答案 1 :(得分:2)
如果您仅使用3个变量进行此操作,则可能无法通过循环播放任何性能点击。
但如果你真的厌恶循环的想法,那么你可以使用arrayfun
来做。
rng = 0:8;
output = arrayfun(@(x)sum([A(2,A(1,:) == x), B(2,B(1,:) == x), C(2,C(1,:) == x)]), rng);
output = cat(1, rng, output);
output =
0 1 2 3 4 5 6 7 8
5 7 12 16 22 17 8 3 2
这对于特别大的A
,B
和C
变量非常有用,因为没有数据复制。