500000x2阵列,查找满足第1列和第2列特定要求的行,MATLAB

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

我在这里面临死胡同

我收集了大量的数据,并且只将我感兴趣的信息分离到一个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’、‘你好’]

所以我要问的数据是:


[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