【问题标题】:Filtering data sets with 1e6 elements on periodic values在周期性值上过滤具有 1e6 个元素的数据集
【发布时间】:2015-11-23 05:12:03
【问题描述】:

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

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 循环是一种显而易见的方法,但速度很慢。数组的大小意味着在进程中生成更大数组的方法往往会由于内存不足而失败。

【问题讨论】:

  • 我们不应该使用您的代码的另一个原因是您覆盖了set 函数。另外,请查看randperm 的帮助。你不想randperm(maximum_value,total_elements)吗?
  • @horchler 我希望我能给 +2!罗斯,我已经更新了这个问题,以防止对实际目标的干扰。我希望没问题。

标签: matlab dataset filtering


【解决方案1】:

假设你有这个:

total_elements = 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。

【讨论】:

  • 谢谢丹尼斯。你的回答真的很有帮助
【解决方案2】:

您的问题似乎是如何从 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 个元素的数组使用循环要快一些。对数组进行整形只是执行时间的一小部分。

【讨论】:

  • 首先,我认为它解决的问题与所要求的略有不同。您的解决方案似乎根据它们的位置而不是它们的值来过滤掉记录。此外,它似乎比我的解决方案慢,尽管我无法轻易看出需要改进的地方。也许避免使用=[] 删除,因为它通常比指定您想要的datar=datar(idx,:) 的替代方法要慢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
相关资源
最近更新 更多