我有以下代码剪切有效,但速度非常慢:
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单行程来解决这个问题。
提前致谢!
编辑:添加了示例输入和输出。
答案 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))})