在Matlab中累积数组

时间:2015-03-05 21:52:20

标签: arrays matlab sum

我有以下代码剪切有效,但速度非常慢:

bps = [5; 10; 15; 20]
src = ['10.0.0.1'; '10.0.0.2'; '10.0.0.1'; '10.0.0.2']

uniqueSrc = unique(src);

sumBps = [];
for i=1:length(uniqueSrc)
    indy=find(ismember(src,uniqueSrc(i)));
    sumBps = [sumBps; sum(bps(indy))];
end

uniqueSrc = ['10.0.0.1'; '10.0.0.2']
sumBps = [20; 30]

src是一个包含IP地址的单元阵列,而一个IP可以多次出现。它是从带有textscan和%s的文件中读取的。 bps包含整数。

我需要总结属于src中相同IP地址的bps中的所有整数。 匹配是根据指数。所以src(1)是bps(1)的IP,依此类推。

结果应该是IP与相应bps值之和的匹配。所以uniqueSrc(1)是具有sumBps(1)的IP,它是属于某个IP的所有bps值的总和。

虽然我的代码肯定有效但看起来非常低效,我想知道什么是着名的matlab单行程来解决这个问题。

提前致谢!

编辑:添加了示例输入和输出。

2 个答案:

答案 0 :(得分:4)

经典使用accumarray

%// Your inputs
bps = [5; 10; 15; 20];
src = ['10.0.0.1'; '10.0.0.2'; '10.0.0.1'; '10.0.0.2'];

%// Relevant code
[uniqueSrc,~,id] = unique(cellstr(src));
sumBps = accumarray(id, bps);

上述代码可能值得一些解释。 accumarray是一个根据ID将数据分组或分组的功能。因此,我所做的是将src转换为带有cellstr的单元格数组,然后使用unique获取所有唯一IP地址的列表以及分配唯一ID到每个IP地址。唯一的IP地址存储在uniqueSrc unique中,这是src的第一个输出,id中的每个IP地址都分配了unique中存储的唯一ID。很多人没有想到的复杂性是src不仅在数组中找到唯一条目,而且还返回排序这些值。从此排序结果中,分配给accumarray中每个元素的ID将遵循此排序约定。因为你想按顺序返回那些IP地址(看起来像它),所以我们不需要考虑这部分。此外,我需要将您的IP地址转换为单元格数组,以便工作。

一旦我们确定了这些,我们使用accumarray,其中第一个元素是每个IP地址的ID,第二个元素是每个IP地址映射到的值。默认情况下,>> uniqueSrc uniqueSrc = '10.0.0.1' '10.0.0.2' >> sumBps sumBps = 20 30 将共享相同ID且总和的值全部加起来。这几乎描述了你想要做什么。

我得到的所需变量的输出是:

{{1}}

答案 1 :(得分:1)

添加我的答案,因为我想展示如何连接IP地址和总计bps,如果您使用rows unique选项,则无需转换为单元格。

bps = [5; 10; 15; 20]
src = ['10.0.0.1'; '10.0.0.2'; '10.0.0.1'; '10.0.0.2'];

[strng ii jj]= unique(src,'rows');


strcat( {strng},{char(32)*ones(size(strng,1),1)},{num2str(accumarray(jj,bps))})