500000x2阵列,查找满足第1列和第2列特定要求的行,MATLAB
我在这里面临死胡同 我收集了大量的数据,并且只将我感兴趣的信息分离到一个500kx2的成对数组中 第1列包含访问点的ID。 第二列包含一个字符串 在第1列中可能多次出现ID,并且在第2列中可以写入任何内容。记住,每行都是成对的 我需要在这些500K对中找到什么: 我想找到在第二列中写有“hello”的所有ID,甚至是行,作为一个附加要求,必须有两个以上的“pair”出现 如果这种情况发生2次以上,最好能节省发生的次数 例如: col1(id):[1,2,6,2,1,2,3,1] col2(str):[‘你好’、‘走’、‘你好’、‘皮兹’、‘你好’、‘da’、‘mn’、‘你好’] 所以我要问的数据是:500000x2阵列,查找满足第1列和第2列特定要求的行,MATLAB,matlab,search,find,rows,find-occurrences,Matlab,Search,Find,Rows,Find Occurrences,我在这里面临死胡同 我收集了大量的数据,并且只将我感兴趣的信息分离到一个500kx2的成对数组中 第1列包含访问点的ID。 第二列包含一个字符串 在第1列中可能多次出现ID,并且在第2列中可以写入任何内容。记住,每行都是成对的 我需要在这些500K对中找到什么: 我想找到在第二列中写有“hello”的所有ID,甚至是行,作为一个附加要求,必须有两个以上的“pair”出现 如果这种情况发生2次以上,最好能节省发生的次数 例如: col1(id):[1,2,6,2,1,2,3,1] col2(str
[1,3],也就是说,ID=1,3次出现ID=1和str='hello'它们是许多可能的解决方案。这里有一个:使用地图结构。映射的键集包含ID(其中“hello”出现在第二列中),值集包含出现的次数 浏览第二列。当您找到“hello”时,检查相应的ID是否已经是映射结构中的键。如果为true,则将+1添加到与该键关联的值。否则,添加一个新对(key,value)=(ID,1) 完成后,从贴图中删除值小于或等于2的所有对。剩下的地图就是你要找的
Matlab映射:我尝试对它进行基准测试,看看它是否能在合理的时间内完成500000行 生成一些测试数据(总计约60MB) 分析
tic
a=ismember(H,{'hello'});
M = accumarray(V(a),1);
idx = find(M>1);
result = [idx,M(idx)];
toc
运行时间为0.011699秒
带循环的替代方法
tic
M=zeros(max(V),1);
for ct = 1:length(H)
if strcmp(H{ct},'hello')
M(V(ct))=M(V(ct))+1;
end
end
idx = find(M>1);
result1 = [idx,M(idx)];
toc
运行时间为0.192560秒
tic
M=zeros(max(V),1);
for ct = 1:length(H)
if strcmp(H{ct},'hello')
M(V(ct))=M(V(ct))+1;
end
end
idx = find(M>1);
result1 = [idx,M(idx)];
toc