从1-D矢量数据中随机选择

时间:2016-07-06 16:03:55

标签: matlab random numbers

请您分享您对以下问题的看法

假设你有像

这样的一维矢量数据
Data=[ a1 a2 a3 a4..... an];   0<ai<100

我们如何找到数据的子集,例如

Data_subset=[ a3 a7 a8]  or  Data_subset=[ a1 a17 a81 a92 a93 a100 a101 ]

最符合此条件:abs(sum(Data_subset)-700)<10

任何想法?

1 个答案:

答案 0 :(得分:0)

您可以按

计算唯一子集的数量(忽略顺序)

唯一=和(((N-1)^ 2 + N-1)/ 2)+ N. 从N = 1到N = 99

因此,如果您只需要对长度为100的向量执行此操作,那么您将只有166750个唯一数据子集。在这种情况下,您应该通过测试每个子集来强制解决问题,即如果您可以创建生成它们的方法。

你可以使用像matlab函数perms()这样的东西,它会给你向量的每个排列,除了你应该有类似1e156的不同排列。

我能想到的唯一部分解决方案是使用randperm()然后创建一个测试随机排列子集的循环

    nPerms = 100
    subSetsSaved = cell()
    cellIndex=1; 
    for iRand=1:1:nPerms
         randOrder = randperm(length(data));
         dataPerm = permute(data,randOrder);
         for jSub=1:1:length(data)
               subSet = dataPerm(1:jSub);
               if (abs(sum(subSet)-700)<10)
                     subSetsSaved{cellIndex} = subSet;
                     cellIndex = cellIndex+1;
               end
          end
     end

您甚至可以使用此随机置换循环来尝试随机生成所有166750个唯一子集。您所要做的就是随机生成,排序和测试唯一性。这些解决方案当然在效率方面并不理想,因此如果这是一个问题,您需要快速解决,或者如果您的设置远大于N = 100,则需要采用不同的方法。