【发布时间】:2020-11-20 07:24:00
【问题描述】:
我想在 Matlab 中对1 和n 之间的m 整数进行采样不替换,其中
m=10^6;
p=13^5;
n=p*(p-1)/2;
我尝试使用randsample如下
random_indices_pairs=randsample(n,m);
但是,我遇到了内存问题
Error using zeros
Requested 1x68929060278 (513.6GB) array exceeds maximum array size preference. Creation of arrays greater than this
limit may take a long time and cause MATLAB to become unresponsive. See array size limit or preference panel for more
information.
Error in randsample (line 149)
x = zeros(1,n); % flags
有没有办法避免这种情况?这里的问题是因为n 很大。
【问题讨论】:
-
一种方法是随机抽样替换,然后查找重复项,并抽样新值以替换它们。这可能只有在 n >> m 时才合理。替换采样的常规算法需要创建一个包含所有要采样的值的数组。
-
谢谢。这是我根据你的评论写的:
A=randi(n,m,1);[U, I] = unique(A, 'stable');A=A(I);m_to_add=m-size(A,1);while m_to_add>0B=randi(n,m_to_add,1);A=[A;B];[U, I] = unique(A, 'stable');[U, I] = unique(A, 'stable');m_to_add=m-size(A,1);@987654 -
请用您的代码发布答案!这对未来的访客很有用。我不会重复
unique(避免代码重复!),而是重复while true,然后在循环结束时if m_to_add==0, break。另外,A=[A;B]非常慢,因为它需要复制所有A,最好替换A中的非唯一元素。不知道代码会是什么样子...... -
还有一个小问题,即您请求的数组是 abso-effing-lutely humongous (513.6GB)。您确定您的计算机将有足够的内存来允许将 > 500G 的数字加载到内存中吗?不能将其拆分为不太占用内存的较小操作吗?