我想用不同的时间戳对齐和计数向量,以计数相应的回收箱。
假设我有来自N的3个矩阵,边=组数在下面的结构中。第一行代表边缘,所以是垃圾桶。第二行表示值。我想把所有的值和在同一个垃圾桶里。
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 ...]我可以循环所有的数字,但我想让它快点。
发布于 2016-03-23 19:41:55
您可以使用累加阵列
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中使用实际的回收箱。为了避免这种情况,正如@Daniel在评论中所说的那样,使用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))].'; 发布于 2016-03-23 19:40:52
如果您只使用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变量是有益的,因为没有数据的复制。
https://stackoverflow.com/questions/36187052
复制相似问题