使用周期值上的1e6元素过滤数据集

时间:2013-08-17 15:51:02

标签: matlab dataset filtering

数据集可以通过以下方式近似:

total_elements = 1e6;
maximum_value = 1e13;
mySet = randperm(maximum_value,total_elements);

或一百万个唯一随机值,按从低到高的顺序排列,值范围为1到1e13。

只有N-2000:1:N+2000范围内的值N = 7000:7000:1e13才真正有用。是否有一种快速且内存有效的方法来生成MatLab中所有有用事件的矩阵列表? for循环是一种显而易见的方法,但速度很慢。数组的大小意味着作为进程的一部分生成更大数组的方法由于缺少内存而倾向于失败。

2 个答案:

答案 0 :(得分:0)

您的问题似乎是如何从1e13元素阵列中有效地提取子集N-2000:N + 2000,其中N = 7000:7000:1e13。

一种可能性是将您的数据阵列重塑为具有正确尺寸的2D数组,以便“有用”元素全部位于相同的行中,然后删除您不想要的行:

N1=100; %2000 in your version
N2=800; %7000 in your version
N3=1e4; %1e13/N2 in your version

array_size = N2*N3;
data = randperm(array_size);

tic
datar=reshape(data,N2,N3);
datar(N1+1:N2-N1-1,:)=[]; %delete unwanted elements
%datar(1:N1)=[];  %according to your specification of the problem, these elements are also not wanted
toc

我不确定这对于使用非常大的阵列的性能有多大益处:在相当简陋的PC上测试它,它似乎比使用具有1e4元素的阵列的循环快一点。重塑数组只是执行时间的一小部分。

答案 1 :(得分:0)

假设你有这个:

total_elements = 1e6; maximum_value = 1e13; mySet = randperm(maximum_value,total_elements);

你想要的值在N的正倍数范围内,你可以这样做:

myRange = 2000;
N = 7000;

m = mod(mySet,7000);
idx = (m < myRange | m > N-myRange) & mySet > myRange;
mySet = mySet(idx);

这应该是相当有效的并且不会消耗过多的内存,在我的电脑上它会在一秒钟内运行。

请注意与m的比较,它可能会被1关闭。