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