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

如何在matlab中使用异步时间戳对齐向量?,matlab,matrix,Matlab,Matrix,我想用不同的时间戳对齐和计算向量,以计算相应的箱子 让我们假设在下面的结构中有3个来自[N,边]=histcounts的矩阵。第一行表示边,因此表示容器。第二行表示值。我想用相同的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 =

我想用不同的时间戳对齐和计算向量,以计算相应的箱子

让我们假设在下面的结构中有3个来自[N,边]=histcounts的矩阵。第一行表示边,因此表示容器。第二行表示值。我想用相同的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 ...]

我可以循环所有的数字,但我想让它更快。

如果你只使用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
变量是有益的,因为不存在数据复制。

如果您只使用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
变量是有益的,因为不需要复制数据。

您可以使用:

注意:
H(:,1)+1
用于强制bin值为正,否则MATLAB将投诉。我们仍然使用输出
V
中的实际箱子。为了避免这种情况,正如@Daniel在评论中所说的,请使用(参见:):

您可以使用:

注意:
H(:,1)+1
用于强制bin值为正,否则MATLAB将投诉。我们仍然使用输出
V
中的实际箱子。为了避免这种情况,正如@Daniel在评论中所说的,请使用(参见:):


要避免+1。那么第一行可以是任何东西(包括负值或浮点),以避免+1。那么第一行可能是任何东西(包括负值或浮点数),谢谢您的回答。比克和丹尼尔的回答更普遍,所以我给了他“接受”的回答。谢谢你的回答。比克和丹尼尔的回答更普遍,所以我给了他“接受”。
H = [A B C].';  %//' stupid syntax highlighting :/
[U, ~, IU] = unique(H(:,1));
V = [U accumarray(IU, H(:,2))].';