对向量中相同的元素进行分组和求和
Group and sum elements that are the same within a vector
假设我有一个看起来像这样的向量(数字将始终 > 0)...
[1, 2, 1, 4, 1, 2, 4, 3]
我需要一个矢量化实现,将数字相加并使用原始数字作为索引来存储数字。所以如果我 运行 我会得到...
% step 1
[1+1+1, 2+2, 3, 4+4]
% step 2
[3, 4, 3, 8]
我已经使用 for 循环实现了这一点,但我觉得有一种矢量化的方法可以实现这一点。我在向量化函数方面仍然很陌生,因此不胜感激。
这听起来像是 accumarray
的工作:
v = [1, 2, 1, 4, 1, 2, 4, 3];
result = accumarray(v(:), v(:)).'
result =
3 4 3 8
其他方法:
使用histcounts
:
x = [1, 2, 1, 4, 1, 2, 4, 3];
u = unique(x);
result = u.*histcounts(x, [u inf]);
使用bsxfun
(可能更占内存):
x = [1, 2, 1, 4, 1, 2, 4, 3];
u = unique(x);
result = u .* sum(bsxfun(@eq, x(:), u(:).' ), 1);
假设我有一个看起来像这样的向量(数字将始终 > 0)...
[1, 2, 1, 4, 1, 2, 4, 3]
我需要一个矢量化实现,将数字相加并使用原始数字作为索引来存储数字。所以如果我 运行 我会得到...
% step 1
[1+1+1, 2+2, 3, 4+4]
% step 2
[3, 4, 3, 8]
我已经使用 for 循环实现了这一点,但我觉得有一种矢量化的方法可以实现这一点。我在向量化函数方面仍然很陌生,因此不胜感激。
这听起来像是 accumarray
的工作:
v = [1, 2, 1, 4, 1, 2, 4, 3];
result = accumarray(v(:), v(:)).'
result =
3 4 3 8
其他方法:
使用
histcounts
:x = [1, 2, 1, 4, 1, 2, 4, 3]; u = unique(x); result = u.*histcounts(x, [u inf]);
使用
bsxfun
(可能更占内存):x = [1, 2, 1, 4, 1, 2, 4, 3]; u = unique(x); result = u .* sum(bsxfun(@eq, x(:), u(:).' ), 1);