如何在matlab中使用异步时间戳对齐矢量?

时间:2016-03-23 19:27:47

标签: matlab matrix

我想对不同时间戳的向量进行对齐和计数,以计算相应的区间。

假设我在[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 ...]

我可以遍历所有数字,但我想快点。

2 个答案:

答案 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

这对于特别大的ABC变量非常有用,因为没有数据复制。