1

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

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

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

只有在 range N-2000:1:N+2000, where中的值N = 7000:7000:1e13才是真正有用的。是否有一种快速且内存高效的方法来生成 MatLab 中所有有用事件的矩阵列表?For 循环是一种显而易见的方法,但速度很慢。数组的大小意味着在进程中生成更大数组的方法往往会由于内存不足而失败。

4

2 回答 2

0

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

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

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 个元素的数组使用循环要快一些。重塑数组只是执行时间的一小部分。

于 2013-08-19T12:45:32.777 回答
0

假设你有这个:

总元素 = 1e6; 最大值= 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。

于 2013-08-19T15:02:36.033 回答